【问题标题】:mat1 and mat2 shapes cannot be multipliedmat1 和 mat2 形状不能相乘
【发布时间】:2021-05-25 23:23:56
【问题描述】:

我是 AI 和 python 的新手,我正在尝试构建一个架构来训练一组图像。后来的目标是过度拟合。但到目前为止,我无法理解如何正确获取输入和输出。每当我尝试训练网络时,我都会一直看到错误:

mat1 and mat2 shapes cannot be multiplied (48x13456 and 16x64)

我的网络:

net2 = nn.Sequential(

nn.Conv2d(3,8, kernel_size=5, padding=0),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),


nn.Conv2d(8,16, kernel_size=5, padding=0),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),

nn.Flatten(),
nn.Linear(16,64),
nn.ReLU(),
nn.Linear(64,10)
)

这是我正在处理的任务的一部分,我真的不明白为什么它没有运行。任何提示!

【问题讨论】:

  • 你输入的形状是什么?
  • 我不确定@Darina 是什么意思,但我认为 torch.Size([48, 3, 128, 128])
  • 我不是 Torch 专家,可能是错的,但在我看来,问题出在线性层的维度上。看看这篇很不错的文章:towardsdatascience.com/…

标签: python pytorch artificial-intelligence conv-neural-network


【解决方案1】:

这是因为您已将 2D cnn 展平为 1D FC 层...
&您必须在展平层之前手动计算从 128 大小到 Maxpool 层的更改输入形状...在您的情况下,它是 29*29*16 所以你的代码必须重写为

net2 = nn.Sequential(

nn.Conv2d(3,8, kernel_size=5, padding=0),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),


nn.Conv2d(8,16, kernel_size=5, padding=0),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),

nn.Flatten(),

nn.Linear(13456,64),
nn.ReLU(),
nn.Linear(64,10)
)

这应该可以工作

编辑:这是一个计算输出大小的简单公式:

  (((W - K + 2P)/S) + 1)
    Here W = Input size
    K = Filter size
    S = Stride
    P = Padding 

所以第一个 conv 块将使您的输出大小为 124
然后你做 Maxpool,它会减半,即 62
第二个转换块将使您的输出大小为 58
然后你的最后一个 Maxpool 将达到 29...
所以最终的扁平输出将是29*29*16,其中 16 是输出通道

【讨论】:

  • 感谢它现在可以使用了!你能解释更多关于手动计算的信息吗?对不起,我还在学习。或将我指向一篇文章。
  • 我已经编辑了答案......希望你能找到解释性
猜你喜欢
  • 2021-09-09
  • 2021-09-23
  • 2023-01-28
  • 1970-01-01
  • 2022-07-15
  • 2021-09-17
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多