基于Timm实现神经网络分层冻结/解冻的二分类迁移学习求助
Timm不同模型分层冻结/解冻示例
下面针对Timm中常用的几种模型,给出分层冻结的实现代码,你可以根据任务需求调整冻结的层级范围:
1. ConvNeXt 分层冻结
ConvNeXt的结构分为stem(输入层)、stages(4个特征提取阶段)和head(分类头)。我们可以选择冻结前N个阶段,只训练后面的阶段和分类头:
import timm convnext = timm.create_model('convnext_tiny_in22k', pretrained=True, num_classes=2) # 冻结stem和前2个stage for name, param in convnext.named_parameters(): if 'stem' in name or 'stages.0' in name or 'stages.1' in name: param.requires_grad = False else: param.requires_grad = True # 可选:验证冻结状态 # for name, param in convnext.named_parameters(): # print(f"{name}: {param.requires_grad}")
2. ResNet 分层冻结
ResNet系列包含conv1、bn1、layer1-layer4(特征提取层)和fc(分类头)。可以冻结底层的特征提取层,只训练高层和分类头:
import timm resnet = timm.create_model('resnet50d', pretrained=True, num_classes=2) # 冻结conv1、bn1和layer1 for name, param in resnet.named_parameters(): if 'conv1' in name or 'bn1' in name or 'layer1' in name: param.requires_grad = False else: param.requires_grad = True
3. Vision Transformer (ViT) 分层冻结
ViT的结构包括patch_embed(图像块嵌入层)、pos_embed(位置嵌入)、blocks(Transformer编码器块)和head(分类头)。通常可以冻结嵌入层和前几个编码器块:
import timm vit = timm.create_model('vit_small_patch16_224', pretrained=True, num_classes=2) # 冻结patch_embed和前3个transformer blocks for name, param in vit.named_parameters(): if 'patch_embed' in name or 'blocks.0' in name or 'blocks.1' in name or 'blocks.2' in name: param.requires_grad = False else: param.requires_grad = True
4. MobileNetV3 分层冻结
MobileNetV3包含stem、bneck(多个瓶颈层)和head。可以冻结输入层和前半部分瓶颈层:
import timm mobilenet = timm.create_model('mobilenetv3_large_100', pretrained=True, num_classes=2) # 冻结stem和前5个bneck层 for name, param in mobilenet.named_parameters(): if 'stem' in name or 'bneck.0' in name or 'bneck.1' in name or 'bneck.2' in name or 'bneck.3' in name or 'bneck.4' in name: param.requires_grad = False else: param.requires_grad = True
通用技巧
- 可以通过
print(model)查看模型的完整结构,明确各层级的命名规则,再针对性设置冻结范围 - 训练过程中可以逐步解冻:先训练高层和分类头,再解冻底层部分层继续训练,提升模型性能
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

