PyTorch自动编码器线性层形状不匹配报错(矩阵无法相乘)
问题本质
你看到的报错mat1 and mat2 shapes cannot be multiplied (16384x3 and 16384x3)并非是同形状矩阵不能相乘,而是矩阵相乘的规则要求第一个矩阵的列数等于第二个矩阵的行数。这里mat1是输入到线性层的张量形状(16384行3列),mat2是线性层权重的形状(16384行3列),3≠16384,因此无法完成矩阵乘法,核心原因是线性层输入的特征数与层定义的in_features不匹配。
解决步骤
准确计算卷积后的特征数
对于1D卷积,输出长度计算公式为:output_length = (input_length - kernel_size + 2*padding) // stride + 1若包含池化层,需用同样逻辑计算池化后的长度。最终展平后的总特征数为
通道数 × 输出长度,这个数值就是编码器线性层的in_features。比如输入形状
[batch_size,1,21],假设经过Conv1d(1,32,kernel_size=3,padding=1,stride=1)后输出长度仍为21,再经过MaxPool1d(2)后长度为10,总特征数就是32×10=320,此时编码器线性层应定义为nn.Linear(320, 3)。规范张量展平操作
展平卷积输出时,必须保留batch维度,只展平特征维度。使用x.flatten(start_dim=1)或x.view(x.size(0), -1),避免使用无参数的x.flatten()(会把batch维度也展平成一维)。添加形状打印定位问题
在模型的forward函数中打印关键步骤的张量形状,快速定位错误点:def forward(self, x): x = self.encoder(x) print("卷积后形状:", x.shape) x = x.flatten(start_dim=1) print("展平后形状:", x.shape) x = self.fc_encoder(x) print("瓶颈层形状:", x.shape) # 解码器逻辑... return x检查线性层定义
编码器最后一个线性层需对应nn.Linear(展平后特征数, 3),解码器起始线性层则为nn.Linear(3, 展平后特征数),确保前后特征数一致。
内容的提问来源于stack exchange,提问作者Caue Evangelista de Sousa

