You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 12:54:06