如何为ResNet创建新层?PyTorch替换ResNet18全连接层报错如何解决
正确修改ResNet18适配CIFAR10的操作步骤
1. 加载预训练模型
正常加载官方预训练的ResNet18即可,默认参数适配3通道图像输入,符合CIFAR10数据集的图像格式:
import torch from torch import nn OrigResNet18 = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
2. 冻结预训练层(迁移学习可选配置)
如果采用特征提取式迁移学习,可先冻结所有前置层的参数,仅训练最后替换的全连接层,降低训练成本:
for param in OrigResNet18.parameters(): param.requires_grad = False
3. 替换最后的全连接层
原ResNet18的fc层是针对1000分类的ImageNet数据集设计的,CIFAR10为10分类,仅需要修改fc层的输出维度即可,无需修改其他层:
# 获取原fc层的输入特征维度 in_features = OrigResNet18.fc.in_features # 替换为适配10分类的新fc层 OrigResNet18.fc = nn.Linear(in_features=in_features, out_features=10, bias=True)
4. 适配CIFAR10小尺寸输入的可选优化
原生ResNet18默认适配224224输入,CIFAR10原生尺寸为3232,除了在数据预处理阶段把图像resize到224*224之外,也可以修改第一层卷积和池化层适配小尺寸输入,提升训练效率:
# 调整第一层卷积参数,不修改输入通道数,适配32*32输入 OrigResNet18.conv1 = nn.Conv2d(3, 64, kernel_size=(3,3), stride=(1,1), padding=(1,1), bias=False) # 去掉第一层最大池化,避免小尺寸图像被过度下采样 OrigResNet18.maxpool = nn.Identity()
原有代码的错误说明
- 擅自修改了第一层
conv1的输入通道为1,而CIFAR10的图像为3通道,输入维度不匹配直接触发了你遇到的RuntimeError - 替换fc层时直接沿用了原模型1000的输出维度,不符合CIFAR10的10分类需求
- 代码中没有给
NewResNet18赋值就直接修改其属性,还会额外触发未定义变量的报错
内容的提问来源于stack exchange,提问作者rumeysa
相关产品推荐
相关产品推荐

