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

如何解决1D ResNet实现ECG QRS间期预测时mat1和mat2无法相乘错误

问题原因
  • 报错本质是全连接层的输入维度和实际传入的张量维度不匹配:你定义linear1时指定的输入维度是19968 * block.expansion(即79872),但经过前面的卷积、池化层计算后,展平得到的张量维度只有3584,矩阵乘法时维度无法对齐。
  • 维度不匹配的根源是你对输入长度的计算出现偏差,我们可以逐层计算输入形状(输入初始形状为[32, 1, 950],格式为[batch_size, channels, length]):
    1. 第一层nn.AvgPool1d(1024, stride=2):池化核大小1024大于输入长度950,无padding的情况下输出长度为1,输出形状[32, 1, 1]
    2. 后续卷积、池化层进一步处理后,在out.view(out.size(0), -1)展平后,得到的形状是[32, 3584](报错里的1是batch维度,对应测试时batch_size为1的情况),和linear1要求的79872维输入完全不符
  • 额外笔误:forward函数中F.rel是拼写错误,正确应为F.relu,不改会触发函数不存在的报错。
解决方法

方法1:直接修正全连接层输入维度

你只需要将linear1的输入维度修改为实际展平后的维度即可,对应你的当前网络结构,修改代码为:

self.linear1 = nn.Linear(3584, 1024)

同时修正forward中的笔误:

out = F.relu(self.bn1(self.conv1(out)))

方法2:使用自适应池化实现维度自动适配(更通用)

如果你后续会修改前面的卷积、池化参数,建议用自适应平均池化固定输出长度,避免每次都手动计算维度,修改方式如下:

  1. 将forward中的固定核平均池化替换为自适应池化:
# 替换 out = F.avg_pool1d(out, 16)
out = F.adaptive_avg_pool1d(out, 1)
  1. 调整linear1的输入维度为layer4的输出通道数(即1024 * expansion = 4096):
self.linear1 = nn.Linear(4096, 1024)

可选优化建议

你当前第一层的平均池化核大小1024远大于输入长度950,会直接丢失所有时域细粒度信息,如果不是刻意设计的话,建议调小池化核大小,比如改为nn.AvgPool1d(3, stride=2, padding=1),可以保留更多ECG信号的特征。

内容的提问来源于stack exchange,提问作者Sara De Luca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:36:01