PyTorch复现论文模型时触发卷积层通道数不匹配报错
问题描述
复现ICASSP 2020收录的采用subpixel层实现反卷积的模型时,代码运行持续报错,初始编写的模型代码如下:
class Net(nn.Module): def __init__(self, upscale_factor = 2): super(Net, self).__init__() # self.input_start = nn.(16,256,3) self.e1 = nn.Conv2d(16,16, (5,1),stride = (1,2),padding='valid') self.e1_dr = nn.Dropout(.5) self.e2 = nn.Conv2d(128,128, (5,1),stride = (1,2),padding='valid') # self.e2.weight self.e2_dr = nn.Dropout(.5) self.e3 = nn.Conv2d(256, 256,(5,1),stride = (1,2),padding='valid') self.e3_dr = nn.Dropout(.5) self.e4 = nn.Conv2d(512, 512, (5,1),stride = (1,2),padding='valid') self.e5 = nn.Conv2d(512,512, (5,1),stride = (2,2),padding='valid') self.e6 = nn.Conv2d(512,512, (3,1),stride = (2,2),padding='valid') self.e7 = nn.Conv2d(512,512, (3,1),stride = (2,2),padding='valid') self.e8 = nn.Conv2d(512,512, (3,1),stride = (2,2),padding='valid') self.d1 = nn.PixelShuffle(upscale_factor ) self.d2 = nn.PixelShuffle(upscale_factor) self.d3 = nn.PixelShuffle(upscale_factor) self.d4 = nn.PixelShuffle(upscale_factor) self.d5 = nn.PixelShuffle(upscale_factor ) self.d6 = nn.PixelShuffle(upscale_factor) self.d7 = nn.PixelShuffle(upscale_factor) self.d8 = nn.PixelShuffle(upscale_factor) def forward(self, x): # x = (F.leaky_relu(self.input_start(x))) x = (F.leaky_relu(self.e1(x))) x = (F.leaky_relu(self.e1(x))) x = (F.leaky_relu(self.e1_dr(x))) x = (F.leaky_relu(self.e2(x))) x = (F.leaky_relu(self.e2_dr(x))) x = (F.leaky_relu(self.e3(x))) x = (F.leaky_relu(self.e3_dr(x))) x = (F.leaky_relu(self.e4(x))) x = (F.leaky_relu(self.e5(x))) x = (F.leaky_relu(self.e6(x))) x = (F.leaky_relu(self.e7(x))) x = (self.e8(x)) x = (F.leaky_relu(self.d1(x))) x = (F.leaky_relu(self.d2(x))) x = (F.leaky_relu(self.d3(x))) x = (F.leaky_relu(self.d4(x))) x = (F.leaky_relu(self.d5(x))) x = (F.leaky_relu(self.d6(x))) x = (F.leaky_relu(self.d7(x))) x = (F.leaky_relu(self.d8(x))) return x
运行代码抛出的报错信息如下:
Given groups=1, weight of size [128, 128, 5, 1], expected input[2, 16, 248, 1] to have 128 channels, but got 16 channels instead.
报错原因
报错核心是卷积层输入输出通道维度不匹配,代码存在多处结构性错误:
- 编码器层通道断层:第一层卷积
e1的输出通道仅为16,但第二层卷积e2要求输入通道为128,维度完全不匹配,是当前报错的直接触发原因。 - 前向传播存在笔误:
forward函数中连续两次调用self.e1(x),属于编写时的冗余错误,会导致特征计算逻辑偏离设计预期。 - 解码器结构不符合API要求:PixelShuffle(亚像素卷积)对输入通道数有强制要求,输入通道必须等于
upscale_factor² × 上采样后输出通道数,代码中未在PixelShuffle前添加通道调整卷积层,直接将编码器输出接入亚像素层,后续运行还会持续触发维度错误。 - 未补全初始层与跳连结构:代码中注释掉的初始输入层未完成定义,也未实现U型结构要求的编码器-解码器特征跳连,和参考模型结构不一致。
修正方案
按以下步骤调整代码即可解决报错:
- 对齐编码器各层通道数:补全初始输入层定义,逐层匹配相邻卷积层的输入输出通道,按照模型设计从低通道逐步升到高通道,保证每一层卷积的输入通道数和上一层输出通道数完全一致。
- 清理前向传播冗余代码:删除重复调用
e1的错误代码,按编码器从浅到深的顺序逐层计算特征,Dropout层按设计位置接入对应卷积输出之后。 - 补全解码器的通道调整卷积:每一个PixelShuffle层之前添加对应卷积层,将通道数调整为
upscale_factor的平方 × 目标输出通道数,保证亚像素卷积的输入维度符合API要求,上采样后的通道数和下一层输入要求匹配。 - 补全跳层连接:按照U型网络结构,将编码器对应层的输出特征和解码器上采样后的特征做通道拼接,再送入下一层解码卷积,匹配参考模型的结构设计。
内容的提问来源于stack exchange,提问作者Muhammad Fazeel
相关产品推荐
相关产品推荐

