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

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型结构要求的编码器-解码器特征跳连,和参考模型结构不一致。
修正方案

按以下步骤调整代码即可解决报错:

  1. 对齐编码器各层通道数:补全初始输入层定义,逐层匹配相邻卷积层的输入输出通道,按照模型设计从低通道逐步升到高通道,保证每一层卷积的输入通道数和上一层输出通道数完全一致。
  2. 清理前向传播冗余代码:删除重复调用e1的错误代码,按编码器从浅到深的顺序逐层计算特征,Dropout层按设计位置接入对应卷积输出之后。
  3. 补全解码器的通道调整卷积:每一个PixelShuffle层之前添加对应卷积层,将通道数调整为upscale_factor的平方 × 目标输出通道数,保证亚像素卷积的输入维度符合API要求,上采样后的通道数和下一层输入要求匹配。
  4. 补全跳层连接:按照U型网络结构,将编码器对应层的输出特征和解码器上采样后的特征做通道拼接,再送入下一层解码卷积,匹配参考模型的结构设计。

内容的提问来源于stack exchange,提问作者Muhammad Fazeel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:39:18