如何解决1D ResNet实现ECG QRS间期预测时mat1和mat2无法相乘错误
问题原因
- 报错本质是全连接层的输入维度和实际传入的张量维度不匹配:你定义
linear1时指定的输入维度是19968 * block.expansion(即79872),但经过前面的卷积、池化层计算后,展平得到的张量维度只有3584,矩阵乘法时维度无法对齐。 - 维度不匹配的根源是你对输入长度的计算出现偏差,我们可以逐层计算输入形状(输入初始形状为
[32, 1, 950],格式为[batch_size, channels, length]):- 第一层
nn.AvgPool1d(1024, stride=2):池化核大小1024大于输入长度950,无padding的情况下输出长度为1,输出形状[32, 1, 1] - 后续卷积、池化层进一步处理后,在
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:使用自适应池化实现维度自动适配(更通用)
如果你后续会修改前面的卷积、池化参数,建议用自适应平均池化固定输出长度,避免每次都手动计算维度,修改方式如下:
- 将
forward中的固定核平均池化替换为自适应池化:
# 替换 out = F.avg_pool1d(out, 16) out = F.adaptive_avg_pool1d(out, 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
相关产品推荐
相关产品推荐

