您的位置首页 >要闻 > 人工智能 >

PyTorch 报错 mat1 and mat2 shapes cannot be multiplied (32x119072 and 800x300)卷积输出

这个报错的核心是矩阵乘法维度规则不满足,Linear 层权重 shape 是[in_features, out_features],要求输入最后一维等于 in_features;这里卷积输出展平后是 [32, 119072],而 Linear 设置的输入维度是 800,119072≠800,矩阵相乘无法执行,这是 CNN 接全连接层最常见问题:卷积特征图展平后的通道 × 高 × 宽,和 Linear 预设输入维数对不上。很多新手写网络时,卷积堆叠完直接写nn.Linear(800,300),但没有提前算好卷积最后输出特征图大小,或者忘记 flatten、flatten 位置写错,就会触发这个维度冲突。

一、报错拆解

  • mat1:卷积输出,batch=32,展平后特征长度 119072 → shape (32, 119072)
  • mat2:Linear 权重,in_features=800,out_features=300 → shape (800, 300)
  • 矩阵乘法要求:mat1 最后一维 = mat2 第一维,也就是 119072 == 800,显然不相等

二、三种主流修复方案对比

方案适用场景操作要点
方案 1:修改 Linear 输入维度,对齐卷积输出不想加池化、不改动卷积把 nn.Linear(800,300) → nn.Linear(119072,300);缺点参数量爆炸,容易过拟合、显存爆掉
方案 2:卷积尾部加全局平均池化 GAP(推荐)分类任务,希望固定特征维度卷积最后一层输出 [B, C, H, W],接nn.AdaptiveAvgPool2d((1,1)),输出变成[B, C, 1,1],flatten 后长度 = 通道数,可控
方案 3:增加池化层、调整卷积 stride/padding需要自定义特征长度在最后几个卷积加大 stride,或者 MaxPool,缩小 H、W,让 CHW=800,匹配 Linear (800,300)

三、错误示例代码

import torch

import torch.nn as nn

class Net(nn.Module):

def __init__(self):

super().__init__()

self.conv = nn.Sequential(

nn.Conv2d(3,16,3,1,1),

nn.Conv2d(16,32,3,1,1)

)

self.fc = nn.Linear(800,300) 预设输入800,和卷积输出不匹配

def forward(self, x):

x = self.conv(x)

x = x.flatten(1) 这里得到 [32,119072]

x = self.fc(x)

return x

四、推荐写法(GAP 方案,稳定可控)

class Net(nn.Module):

def __init__(self):

super().__init__()

self.conv = nn.Sequential(

nn.Conv2d(3,16,3,1,1),

nn.Conv2d(16,32,3,1,1)

)

self.gap = nn.AdaptiveAvgPool2d((1,1))

self.fc = nn.Linear(32,300) 通道数32,输入维度固定

def forward(self, x):

x = self.conv(x)

x = self.gap(x)

x = x.flatten(1)

x = self.fc(x)

return x

五、排查步骤清单

  1. 在 flatten 之前加 print,打印卷积输出 shape:print(x.shape),确认 [B, C, H, W]
  2. 计算 C*H*W,这个数值就是 flatten 之后的特征长度,必须和 Linear 第一个参数一致
  3. 确认 flatten 起始维度:flatten(1) 是保留 batch,从第 1 维开始展平,不要写成 flatten (0)
  4. 如果图片输入尺寸会变,优先 AdaptiveAvgPool2d,不要硬算 H、W
  5. 确认卷积 stride、padding、kernel_size,图片分辨率变化也会改变 CHW

【相关 FAQ】

问题 1:报错 mat1 and mat2 shapes cannot be multiplied (32x119072 and 800x300),为什么卷积接 Linear 会出现这个维度冲突?

回答 1:报错 mat1 and mat2 shapes cannot be multiplied (32x119072 and 800x300),是卷积输出特征图展平之后总长度 119072,和 Linear 层定义的输入维度 800 不一致,矩阵乘法前后维度不匹配,这是卷积特征接入 Linear 最常见问题。

问题 2:报错 mat1 and mat2 shapes cannot be multiplied (32x119072 and 800x300),直接把 Linear 改成 nn.Linear (119072,300) 行不行?

回答 2:可以临时消除报错,但不推荐,119072 维的输入会让全连接层参数量巨大,占用大量显存,极易过拟合,适合快速验证,不适合正式训练。

问题 3:报错 mat1 and mat2 shapes cannot be multiplied (32x119072 and 800x300),AdaptiveAvgPool2d 怎么解决这个问题?

回答 3:报错 mat1 and mat2 shapes cannot be multiplied (32x119072 and 800x300),在卷积后面加上 AdaptiveAvgPool2d ((1,1)),把 H、W 压缩到 1,flatten 之后特征长度等于通道数,输入维度可控,不受原图分辨率影响。

问题 4:报错 mat1 and mat2 shapes cannot be multiplied (32x119072 and 800x300),flatten (1) 和 flatten () 有什么区别?

回答 4:报错 mat1 and mat2 shapes cannot be multiplied (32x119072 and 800x300),flatten (1) 保留 batch 维度,只把后面特征维度展平;flatten () 会把 batch 也一起展平,会带来完全错误的 shape,CNN 接 Linear 必须用 flatten (1)。

【参考资料】

[2026-04-10](PyTorch matmul shape mismatch CNN Linear)Stack Overflow

[2026-02-15](nn.AdaptiveAvgPool2d 使用场景)PyTorch 官方文档

[2025-09-20](CNN 全连接层维度计算方法)知乎 PyTorch 教程

[2026-05-01](flatten 维度参数说明)PyTorch docs

【免责声明】

本文基于 PyTorch 常规版本调试,卷积输出尺寸受输入图片分辨率、kernel、stride、padding 共同影响,代码示例仅用于定位该报错,需要根据你的输入尺寸、卷积通道自行调整参数。