Vision Transformer在timm中的实现与优化
Vision Transformer在timm中的实现与优化【免费下载链接】pytorch-image-modelsThe largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Vision Transformer (ViT), MobileNetV4, MobileNet-V3 V2, RegNet, DPN, CSPNet, Swin Transformer, MaxViT, CoAtNet, ConvNeXt, and more项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models本文深入探讨了timm库中Vision Transformer的多种架构变体、注意力机制优化技术和性能调优策略。重点介绍了并行注意力架构、融合注意力计算、查询-键归一化技术、动态图像尺寸支持等核心优化方法以及绝对、相对、旋转位置编码等不同位置编码策略的实现细节。文章还详细分析了各种注意力变体的计算复杂度、内存使用和适用场景为开发者提供了全面的ViT模型优化和部署指南。ViT架构变体与注意力机制优化在timm库中Vision Transformer的实现不仅包含了标准的ViT架构还集成了多种先进的变体和注意力机制优化技术。这些优化使得ViT模型在计算效率、内存使用和性能表现方面都得到了显著提升。并行注意力架构timm实现了基于《Scaling Vision Transformers to 22 Billion Parameters》论文的并行ViT块将MLP和注意力计算并行化class ParallelScalingBlock(nn.Module): Parallel ViT block (MLP Attention in parallel) def __init__(self, dim, num_heads, mlp_ratio4., qkv_biasFalse, qk_normFalse, proj_drop0., attn_drop0., init_valuesNone, drop_path0., act_layernn.GELU, norm_layernn.LayerNorm, mlp_layerNone): super().__init__() # 合并MLP fc1和qkv投影 self.in_norm norm_layer(dim) mlp_hidden_dim int(mlp_ratio * dim) in_proj_out_dim mlp_hidden_dim 3 * dim self.in_proj nn.Linear(dim, in_proj_out_dim, biasqkv_bias) self.in_split [mlp_hidden_dim] [dim] * 3 # 注意力机制配置 self.q_norm norm_layer(dim // num_heads) if qk_norm else nn.Identity() self.k_norm norm_layer(dim // num_heads) if qk_norm else nn.Identity() self.attn_drop nn.Dropout(attn_drop) self.attn_out_proj nn.Linear(dim, dim) # MLP配置 self.mlp_act act_layer() self.mlp_out_proj nn.Linear(mlp_hidden_dim, dim) self.ls LayerScale(dim, init_valuesinit_values) if init_values else nn.Identity() self.drop_path DropPath(drop_path) if drop_path 0. else nn.Identity()这种并行架构通过合并投影计算减少了内存访问次数显著提升了训练和推理效率。融合注意力计算优化timm集成了PyTorch的融合注意力计算功能通过环境变量TIMM_FUSED_ATTN控制class Attention(nn.Module): fused_attn: Final[bool] def __init__(self, dim, num_heads8, qkv_biasFalse, qk_normFalse, attn_drop0., proj_drop0., norm_layernn.LayerNorm): super().__init__() self.fused_attn use_fused_attn() # 检查是否启用融合注意力 def forward(self, x): if self.fused_attn: # 使用PyTorch原生融合注意力 x F.scaled_dot_product_attention( q, k, v, dropout_pself.attn_drop.p if self.training else 0., ) else: # 传统注意力计算 attn (q k.transpose(-2, -1)) * self.scale attn attn.softmax(dim-1) attn self.attn_drop(attn) x attn v融合注意力计算通过减少中间张量的创建和内存拷贝在支持CUDA的设备上可以获得显著的性能提升。查询-键归一化技术timm实现了查询-键归一化QK-Norm技术这是近年来注意力机制的重要优化class Attention(nn.Module): def __init__(self, dim, num_heads8, qkv_biasFalse, qk_normFalse, ...): super().__init__() self.q_norm norm_layer(self.head_dim) if qk_norm else nn.Identity() self.k_norm norm_layer(self.head_dim) if qk_norm else nn.Identity() def forward(self, x): q, k, v self.qkv(x).split([self.dim, self.dim, self.dim], dim-1) q self.q_norm(q.view(B, N, self.num_heads, self.head_dim)) k self.k_norm(k.view(B, N, self.num_heads, self.head_dim))QK-Norm通过对查询和键向量进行层归一化改善了训练稳定性特别是在大规模模型和长序列处理中表现优异。动态图像尺寸支持timm的ViT实现支持动态图像尺寸处理无需重新训练即可适应不同分辨率的输入class VisionTransformer(nn.Module): def __init__(self, img_size224, patch_size16, dynamic_img_sizeFalse, dynamic_img_padFalse, **kwargs): super().__init__() self.dynamic_img_size dynamic_img_size self.dynamic_img_pad dynamic_img_pad def forward_features(self, x): if self.dynamic_img_size: # 动态调整位置编码 pos_embed self._resize_pos_embed( self.pos_embed, (x.shape[2] // self.patch_size, x.shape[3] // self.patch_size) )这种动态支持使得同一个预训练模型可以处理多种分辨率的输入极大提升了模型的实用性。多种注意力变体对比下表展示了timm中支持的不同注意力机制变体及其特性注意力变体计算复杂度内存使用训练稳定性适用场景标准注意力O(N²)高中等通用场景融合注意力O(N²)中高CUDA设备并行注意力O(N²)中高大规模模型线性注意力O(N)低中等长序列处理局部注意力O(N√N)低高高分辨率图像层缩放与残差连接优化timm实现了LayerScale技术这是现代ViT架构中的重要优化class LayerScale(nn.Module): def __init__(self, dim, init_values1e-5, inplaceFalse): super().__init__() self.gamma nn.Parameter(init_values * torch.ones(dim)) def forward(self, x): return x.mul_(self.gamma) if self.inplace else x * self.gamma class Block(nn.Module): def __init__(self, dim, num_heads, init_valuesNone, ...): super().__init__() self.ls1 LayerScale(dim, init_valuesinit_values) if init_values else nn.Identity() self.ls2 LayerScale(dim, init_valuesinit_values) if init_values else nn.Identity()LayerScale通过可学习的缩放参数增强了残差连接的表达能力特别是在深度网络中效果显著。位置编码变体timm支持多种位置编码方案包括绝对位置编码标准的可学习位置嵌入相对位置编码基于相对距离的位置偏置旋转位置编码RoPE通过旋转矩阵编码位置信息无位置编码完全依赖注意力机制学习位置关系# RoPE位置编码示例 if self.use_rope: # 应用旋转位置编码 q apply_rotary_pos_emb(q, self.rope_freqs) k apply_rotary_pos_emb(k, self.rope_freqs)注意力头配置优化timm允许灵活配置注意力头的数量和维度class VisionTransformer(nn.Module): def __init__(self, num_heads12, qkv_biasTrue, qk_scaleNone, attn_drop_rate0., ...): # 支持不同的头配置 assert dim % num_heads 0, dim必须能被num_heads整除 self.head_dim dim // num_heads这种灵活性使得用户可以根据具体任务和硬件条件优化模型配置。性能优化技术汇总下表总结了timm中ViT注意力机制的主要优化技术优化技术实现方式性能提升内存节省融合注意力F.scaled_dot_product_attention20-30%15-25%并行计算MLP和注意力并行10-20%10-15%QK归一化查询键向量归一化训练稳定性无影响动态尺寸运行时位置编码调整灵活性无影响LayerScale可学习残差缩放收敛速度轻微增加这些优化技术的组合使得timm中的ViT实现不仅在精度上达到state-of-the-art水平在计算效率和实用性方面也表现出色。通过灵活的配置选项研究人员和开发者可以根据具体需求选择最适合的注意力机制变体。位置编码策略绝对、相对、旋转位置编码在Vision Transformer中位置编码是至关重要的组件它帮助模型理解图像中不同patch之间的空间关系。timm库提供了多种先进的位置编码策略包括绝对位置编码、相对位置编码和旋转位置编码每种策略都有其独特的优势和适用场景。绝对位置编码 (Absolute Position Embedding)绝对位置编码是最基础的位置编码方式为每个空间位置分配一个固定的嵌入向量。在timm中绝对位置编码通过可学习的参数矩阵实现class VisionTransformer(nn.Module): def __init__(self, img_size224, patch_size16, in_chans3, num_classes1000, embed_dim768, depth12, num_heads12, mlp_ratio4., qkv_biasTrue, representation_sizeNone, distilledFalse, drop_rate0., attn_drop_rate0., drop_path_rate0., embed_layerPatchEmbed, norm_layerNone, act_layerNone, weight_init, class_tokenTrue, global_pooltoken): super().__init__() # 绝对位置编码初始化 num_patches self.patch_embed.num_patches self.pos_embed nn.Parameter(torch.zeros(1, num_patches self.num_prefix_tokens, embed_dim)) # 位置编码的插值支持 self.register_buffer(pos_embed_orig_size, torch.tensor([img_size // patch_size] * 2))绝对位置编码的优势在于简单直接但对于不同分辨率的输入需要进行插值处理。timm提供了专门的插值函数def resample_abs_pos_embed( posemb: torch.Tensor, new_size: List[int], old_size: Optional[List[int]] None, num_prefix_tokens: int 1, interpolation: str bicubic, antialias: bool True ): # 实现双三次插值来调整位置编码尺寸 if old_size is None: hw int(math.sqrt(num_pos_tokens - num_prefix_tokens)) old_size hw, hw posemb posemb.float() posemb posemb.reshape(1, old_size[0], old_size[1], -1).permute(0, 3, 1, 2) posemb F.interpolate(posemb, sizenew_size, modeinterpolation, antialiasantialias) posemb posemb.permute(0, 2, 3, 1).reshape(1, -1, embed_dim) return posemb相对位置编码 (Relative Position Embedding)相对位置编码关注的是token之间的相对距离关系而不是绝对位置。timm实现了基于窗口的相对位置偏置class RelPosBias(nn.Module): 相对位置偏置模块 def __init__(self, window_size, num_heads, prefix_tokens0): super().__init__() self.window_size window_size self.window_area window_size[0] * window_size[1] # 生成相对位置索引 self.register_buffer( relative_position_index, gen_relative_position_index(self.window_size, class_tokenprefix_tokens 0).view(-1), persistentFalse, ) # 可学习的相对位置偏置表 num_relative_distance (2 * window_size[0] - 1) * (2 * window_size[1] - 1) 3 * prefix_tokens self.relative_position_bias_table nn.Parameter(torch.zeros(num_relative_distance, num_heads)) def get_bias(self) - torch.Tensor: relative_position_bias self.relative_position_bias_table[self.relative_position_index] return relative_position_bias.view(self.bias_shape).permute(2, 0, 1).unsqueeze(0)相对位置编码的核心优势在于其平移不变性能够更好地处理不同分辨率的输入无需插值操作。旋转位置编码 (Rotary Position Embedding, RoPE)旋转位置编码是近年来最先进的位置编码方法通过旋转变换将位置信息编码到查询和键向量中def apply_rot_embed(x: torch.Tensor, sin_emb, cos_emb): 应用旋转位置编码到输入张量 if sin_emb.ndim 3: return x * cos_emb.unsqueeze(1).expand_as(x) rot(x) * sin_emb.unsqueeze(1).expand_as(x) return x * cos_emb rot(x) * sin_emb def rot(x): 旋转操作将复数形式的向量进行旋转 return torch.stack([-x[..., 1::2], x[..., ::2]], -1).reshape(x.shape)旋转位置编码的构建过程def build_rotary_pos_embed( feat_shape: List[int], dim: int 64, max_res: int 224, temperature: float 10000., linear_bands: bool False, in_pixels: bool True ): 构建旋转位置编码的正弦和余弦分量 sin_emb, cos_emb build_fourier_pos_embed( feat_shape, num_bandsdim // 4, max_resmax_res, temperaturetemperature, linear_bandslinear_bands, in_pixelsin_pixels ) # 调整形状以适应旋转操作 num_spatial_dim 1 for x in feat_shape: num_spatial_dim * x sin_emb sin_emb.reshape(num_spatial_dim, -1).repeat_interleave(2, -1) cos_emb cos_emb.reshape(num_spatial_dim, -1).repeat_interleave(2, -1) return sin_emb, cos_emb三种位置编码策略对比编码类型核心思想优势适用场景绝对位置编码为每个位置分配固定向量实现简单计算高效固定分辨率任务相对位置编码编码位置间相对关系平移不变性支持多分辨率需要尺度不变性的任务旋转位置编码通过旋转变换编码位置外推能力强理论优雅长序列和可变分辨率任务实际应用示例在timm中使用不同位置编码的Vision Transformer变体import timm # 使用绝对位置编码的标准ViT model_abs timm.create_model(vit_base_patch16_224, pretrainedTrue) # 使用相对位置编码的ViT model_rel timm.create_model(vit_relpos_base_patch16_224, pretrainedTrue) # 使用旋转位置编码的ViT如果可用 # model_rope timm.create_model(vit_rope_base_patch16_224, pretrainedTrue)性能优化建议内存优化相对位置编码通常比绝对位置编码更节省内存特别是在处理高分辨率图像时计算效率旋转位置编码在推理时几乎没有额外计算开销泛化能力相对和旋转位置编码在测试时分辨率与训练时不同的情况下表现更好位置编码策略的选择应该基于具体任务需求、计算资源约束和预期的输入分辨率变化。timm库提供了灵活的配置选项使得开发者可以轻松地在不同位置编码策略之间进行切换和实验。动态图像尺寸支持与特征提取在计算机视觉任务中处理不同尺寸的输入图像是一个常见需求。传统的Vision Transformer模型通常要求固定尺寸的输入这在实际应用中存在诸多限制。timm库通过引入动态图像尺寸支持机制为Vision Transformer模型提供了灵活的图像处理能力。动态图像尺寸支持机制timm库通过PatchEmbed模块的dynamic_img_pad参数实现了动态图像尺寸支持。当启用该功能时模型可以处理任意尺寸的输入图像系统会自动进行适当的填充以确保图像尺寸能够被patch大小整除。class PatchEmbed(nn.Module): def __init__( self, img_size: Optional[int] 224, patch_size: int 16, in_chans: int 3, embed_dim: int 768, norm_layer: Optional[Callable] None, flatten: bool True, output_fmt: Optional[str] None, bias: bool True, strict_img_size: bool True, dynamic_img_pad: bool False, # 动态填充开关 ): # ... 初始化代码 self.dynamic_img_pad dynamic_img_pad def forward(self, x): B, C, H, W x.shape if self.dynamic_img_pad: # 动态计算填充量 pad_h (self.patch_size[0] - H % self.patch_size[0]) % self.patch_size[0] pad_w (self.patch_size[1] - W % self.patch_size[1]) % self.patch_size[1] x F.pad(x, (0, pad_w, 0, pad_h)) x self.proj(x) # ... 后续处理特征提取流程timm库提供了灵活的特征提取机制支持从不同层级获取特征图。通过features_only参数和out_indices参数用户可以精确控制需要提取的特征层级。# 创建支持特征提取的ViT模型 model timm.create_model( vit_base_patch16_224, pretrainedTrue, features_onlyTrue, # 启用特征提取模式 out_indices(2, 4, 6) # 指定提取的层级索引 ) # 处理动态尺寸输入 input_tensor torch.randn(1, 3, 384, 512) # 非标准尺寸 features model(input_tensor) for i, feat in enumerate(features): print(fLayer {i}: {feat.shape})多尺度特征融合timm库支持从Vision Transformer的不同层级提取特征便于实现多尺度特征融合。这种能力对于目标检测、语义分割等需要多尺度信息的任务尤为重要。位置编码的动态调整对于动态尺寸的输入timm库提供了智能的位置编码调整机制。系统会根据实际的图像尺寸动态调整位置编码确保空间信息的准确性。def resample_abs_pos_embed( posemb: torch.Tensor, new_size: List[int], old_size: Optional[List[int]] None, num_prefix_tokens: int 1, interpolation: str bicubic, antialias: bool True, verbose: bool False, ): 重新采样绝对位置编码以适应新的特征图尺寸 参数: posemb: 原始位置编码张量 new_size: 目标特征图尺寸 [height, width] old_size: 原始特征图尺寸 [height, width] num_prefix_tokens: 前缀token数量如class token interpolation: 插值方法 antialias: 是否使用抗锯齿 # 实现细节...实际应用示例以下是一个完整的动态尺寸图像处理示例展示了如何利用timm库处理不同尺寸的输入图像并提取多尺度特征import torch import timm import torch.nn.functional as F # 创建支持动态尺寸的ViT模型 model timm.create_model( vit_base_patch16_224, pretrainedTrue, img_size384, # 训练时的基准尺寸 dynamic_img_sizeTrue, dynamic_img_padTrue, features_onlyTrue, out_indices(3, 6, 9) # 提取中间层的特征 ) # 处理不同尺寸的输入图像 image_sizes [(256, 256), (384, 512), (480, 640)] for height, width in image_sizes: # 生成模拟输入 input_tensor torch.randn(1, 3, height, width) # 前向传播获取多尺度特征 features model(input_tensor) print(f\n输入尺寸: {height}x{width}) for i, feat in enumerate(features): print(f特征层 {i}: {feat.shape})性能优化考虑使用动态图像尺寸支持时需要注意以下性能优化策略优化策略说明适用场景批量相同尺寸处理将相同尺寸的图像组成批次推理优化预计算位置编码对常见尺寸预计算位置编码内存优化梯度检查点减少内存使用训练优化混合精度使用FP16/BP16速度优化兼容性说明timm库的动态尺寸支持与以下特性完全兼容预训练权重可以在不重新训练的情况下使用现有预训练模型模型导出支持ONNX、TorchScript等格式导出分布式训练完全支持多GPU训练和推理量化加速与INT8/FP16量化兼容通过这种动态图像尺寸支持机制timm库为Vision Transformer模型提供了前所未有的灵活性使其能够更好地适应实际应用中的多样化输入需求。ViT模型性能调优与部署技巧Vision Transformer (ViT) 作为计算机视觉领域的革命性架构在timm库中得到了全面而深入的实现。在实际应用中如何充分发挥ViT模型的性能潜力并实现高效部署是每个开发者都需要掌握的关键技能。本文将深入探讨timm中ViT模型的性能调优策略和部署优化技巧。融合注意力机制优化timm库中的ViT实现采用了先进的融合注意力机制通过F.scaled_dot_product_attention来显著提升计算效率。这种优化在支持CUDA的GPU上能够获得显著的性能提升。import torch import timm from timm.layers import use_fused_attn # 检查是否支持融合注意力 print(fFused attention supported: {use_fused_attn()}) # 创建支持融合注意力的ViT模型 model timm.create_model(vit_base_patch16_224, pretrainedTrue) # 启用融合注意力默认已启用 model timm.create_model(vit_base_patch16_224, pretrainedTrue, fused_attnTrue)融合注意力机制的工作原理如下动态图像尺寸支持timm中的ViT模型支持动态图像尺寸处理这对于处理不同分辨率的输入图像非常有用特别是在部署场景中。# 启用动态图像尺寸支持 model timm.create_model(vit_base_patch16_224, pretrainedTrue, dynamic_img_sizeTrue, dynamic_img_padTrue) # 处理不同尺寸的图像 input_256 torch.randn(1, 3, 256, 256) input_384 torch.randn(1, 3, 384, 384) # 自动调整位置编码和补丁嵌入 output_256 model(input_256) output_384 model(input_384) print(fOutput shape for 256x256: {output_256.shape}) print(fOutput shape for 384x384: {output_384.shape})动态尺寸处理的工作流程特征提取优化timm提供了强大的特征提取功能支持从ViT模型中提取中间层特征这对于迁移学习和特征工程非常有用。# 启用特征提取模式 model timm.create_model(vit_base_patch16_224, pretrainedTrue, features_onlyTrue, out_indices(4, 8, 12)) # 提取第4、8、12层的特征 # 获取中间层特征 input_tensor torch.randn(1, 3, 224, 224) features model(input_tensor) for i, feat in enumerate(features): print(fFeature {i} shape: {feat.shape}) # 使用forward_intermediates API final_feat, intermediates model.forward_intermediates(input_tensor) print(fFinal feature shape: {final_feat.shape}) for i, intermediate in enumerate(intermediates): print(fIntermediate {i} shape: {intermediate.shape})混合精度训练与推理混合精度训练可以显著减少内存使用并加速训练过程timm对此提供了完善的支持。import torch.cuda.amp as amp # 混合精度训练配置 model timm.create_model(vit_base_patch16_224, pretrainedTrue) model model.cuda() optimizer torch.optim.AdamW(model.parameters(), lr1e-4) scaler amp.GradScaler() # 训练循环 for inputs, targets in dataloader: inputs, targets inputs.cuda(), targets.cuda() with amp.autocast(): outputs model(inputs) loss criterion(outputs, targets) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() # 混合精度推理 with torch.no_grad(), amp.autocast(): outputs model(inputs)模型量化与优化timm支持多种模型量化技术可以显著减少模型大小并提升推理速度。# 动态量化 quantized_model torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtypetorch.qint8 ) # 训练后静态量化 model.eval() model.qconfig torch.quantization.get_default_qconfig(fbgemm) torch.quantization.prepare(model, inplaceTrue) # 校准步骤... torch.quantization.convert(model, inplaceTrue) # 使用量化模型进行推理 with torch.no_grad(): quantized_output quantized_model(inputs)部署优化策略在实际部署中需要考虑多种优化策略来提升ViT模型的性能。批处理优化# 优化批处理大小 optimal_batch_size find_optimal_batch_size(model, input_shape(3, 224, 224)) print(fOptimal batch size: {optimal_batch_size}) # 使用TensorRT加速 import tensorrt as trt # TensorRT转换和优化代码...内存优化表优化技术内存减少速度提升精度损失混合精度训练30-50%1.5-3x1%动态量化4x2-4x1-2%静态量化4x3-4x2-3%层融合轻微10-20%无性能监控与调试timm提供了丰富的性能监控工具帮助开发者分析和优化模型性能。from torch.utils.benchmark import Timer import time # 性能基准测试 def benchmark_model(model, input_size, num_runs100): model.eval() input_tensor torch.randn(input_size).cuda() # Warmup for _ in range(10): _ model(input_tensor) # Benchmark start_time time.time() for _ in range(num_runs): _ model(input_tensor) end_time time.time() return (end_time - start_time) / num_runs # 测试不同配置的性能 configs [ (vit_base_patch16_224, (1, 3, 224, 224)), (vit_large_patch16_224, (1, 3, 224, 224)), (vit_base_patch16_384, (1, 3, 384, 384)) ] for model_name, input_size in configs: model timm.create_model(model_name, pretrainedTrue).cuda() avg_time benchmark_model(model, input_size) print(f{model_name}: {avg_time*1000:.2f} ms per inference)高级优化技巧梯度检查点技术# 启用梯度检查点以减少内存使用 model timm.create_model(vit_large_patch16_224, pretrainedTrue, use_checkpointTrue) # 自定义检查点配置 from timm.models._manipulate import checkpoint_seq class CheckpointViT(nn.Module): def __init__(self, vit_model): super().__init__() self.vit vit_model def forward(self, x): # 只在特定层使用检查点 return checkpoint_seq(self.vit.blocks[:8], x) \ self.vit.blocks[8:](x)自定义注意力优化# 实现稀疏注意力机制 class SparseAttention(nn.Module): def __init__(self, dim, num_heads, sparse_ratio0.5): super().__init__() self.dim dim self.num_heads num_heads self.sparse_ratio sparse_ratio def forward(self, x): B, N, C x.shape # 实现稀疏注意力逻辑 # ... return x # 替换标准注意力层 model.blocks[0].attn SparseAttention(dim768, num_heads12)通过上述优化技巧和部署策略可以显著提升ViT模型在实际应用中的性能表现。timm库提供的丰富功能和灵活配置使得开发者能够根据具体需求选择最适合的优化方案在保持模型精度的同时最大化性能收益。总结本文全面介绍了timm库中Vision Transformer的实现与优化技术涵盖了从基础架构到高级优化的各个方面。通过并行注意力计算、融合注意力机制、QK归一化等技术创新timm中的ViT模型在计算效率、内存使用和性能表现方面都得到了显著提升。动态图像尺寸支持和多种位置编码策略为模型提供了更好的实用性和灵活性。文章还提供了详细的性能调优建议和部署技巧包括混合精度训练、模型量化、批处理优化等实用方法帮助开发者在实际应用中充分发挥ViT模型的潜力在保持精度的同时最大化性能收益。【免费下载链接】pytorch-image-modelsThe largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Vision Transformer (ViT), MobileNetV4, MobileNet-V3 V2, RegNet, DPN, CSPNet, Swin Transformer, MaxViT, CoAtNet, ConvNeXt, and more项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2470831.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!