Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python mat1和mat2形状不能相乘_Python_Pytorch_Artificial Intelligence_Conv Neural Network - Fatal编程技术网

Python mat1和mat2形状不能相乘

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.

我不熟悉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.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])我不是火炬专家,可能是错的,但在我看来问题在于你的线性层的尺寸。看一看这篇非常好的文章:谢谢,它现在可以工作了!。你能解释一下手工计算吗?对不起,我还在学习。或者给我指一篇文章。我已经编辑了答案……希望你能找到解释。谢谢,它现在起作用了!。你能解释一下手工计算吗?对不起,我还在学习。或者给我指一篇文章。我已经编辑了答案……希望你能找到解释