Python mat1和mat2形状不能相乘
我不熟悉AI和python,我正在尝试构建一个架构来训练一组图像。后来,我们的目标是过度健身。但到目前为止,我还不知道如何正确地获取输入和输出。每当我尝试训练网络时,我总是看到错误:Python mat1和mat2形状不能相乘,python,pytorch,artificial-intelligence,conv-neural-network,Python,Pytorch,Artificial Intelligence,Conv Neural Network,我不熟悉AI和python,我正在尝试构建一个架构来训练一组图像。后来,我们的目标是过度健身。但到目前为止,我还不知道如何正确地获取输入和输出。每当我尝试训练网络时,我总是看到错误: mat1和mat2形状不能相乘(48x13456和16x64) 我的网络: net2 = nn.Sequential( nn.Conv2d(3,8, kernel_size=5, padding=0), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2), nn.
mat1和mat2形状不能相乘(48x13456和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)
)
这是我正在处理的任务的一部分,我真的不明白为什么它没有运行。任何提示 这是因为您已将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
第二个conv块将使您的输出大小为58
那么您的最后一个Maxpool将达到29…
因此,最终的平坦输出将是
29*29*16
,其中16是输出通道因为您已将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
第二个conv块将使您的输出大小为58
那么您的最后一个Maxpool将达到29…
所以最终的平坦输出将是
29*29*16
其中16是输出通道您输入的形状是什么?我不确定@Darina是什么意思,但我认为torch.Size([48,3,128,128])我不是火炬专家,可能是错的,但在我看来问题在于您的线性层的尺寸。看看这篇非常好的文章:你输入的形状是什么?我不确定@Darina是什么意思,但我认为torch.Size([48,3,128,128])我不是火炬专家,可能是错的,但在我看来问题在于你的线性层的尺寸。看一看这篇非常好的文章:谢谢,它现在可以工作了!。你能解释一下手工计算吗?对不起,我还在学习。或者给我指一篇文章。我已经编辑了答案……希望你能找到解释。谢谢,它现在起作用了!。你能解释一下手工计算吗?对不起,我还在学习。或者给我指一篇文章。我已经编辑了答案……希望你能找到解释