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

训练ResNet模型后新增层引发RuntimeError:矩阵形状不匹配求助

问题分析与解决方案

错误原因

你遇到的RuntimeError核心是模型层维度不匹配:

  • 原vision_learner创建的ResNet34模型中,learn.model[1]是适配120类任务的输出head,它的最终输出维度为120(对应你的120种犬类)。
  • 你新增的nn.Linear(512, 120)要求输入维度是512,但前一层(原head的输出)维度仅为120,导致矩阵乘法时128x120与512x120无法运算,触发错误。

简言之:原head已经把特征从512维压缩到120维了,你再接一个需要512维输入的层,自然不兼容。

正确修改方式

要新增层,需要在原head的**特征压缩阶段(输出120维之前)**添加,而非在输出之后。具体步骤如下:

  1. 先查看原head结构(可选但推荐):
print(learn.model[1])

你会看到类似这样的输出(ResNet34的默认head):

Sequential(
  (0): AdaptiveAvgPool2d(output_size=1)
  (1): Flatten(full=False)
  (2): Linear(in_features=512, out_features=120, bias=True)
)

这里的Linear(512,120)就是把backbone输出的512维特征映射到120类的核心层。

  1. 重新构建包含新增层的head:
learn.unfreeze()

# 保留原池化、展平层,在原线性层前新增全连接层
new_head = nn.Sequential(
    learn.model[1][0],  # 原池化层
    learn.model[1][1],  # 原展平层
    nn.Linear(512, 256),  # 新增层:512维特征→256维
    nn.ReLU(),
    nn.Linear(256, 120)   # 最终映射到120类
)

learn.model[1] = new_head  # 替换原head

# 继续训练
learn.fit_one_cycle(1, lr_max=slice(1e-6, 1e-4))

额外提醒

  • 修改模型结构前,务必打印并确认每层的输入输出维度,避免维度不匹配问题。
  • 如果只是想调整最后一层参数,无需额外拼接新层,直接修改原Linear层即可。

内容的提问来源于stack exchange,提问作者Dimitriy Glefa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:23:11