我是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))
这是我正在进行的一个任务的一部分,我真的不明白为什么它无法运行。有什么提示吗?
回答:
这是因为你将2D的CNN展平成了1D的全连接层…
并且你需要手动计算从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) 这里 W = 输入大小 K = 滤波器大小 S = 步长 P = 填充
所以第一个卷积块会使你的输出大小变为124
然后你进行Maxpool操作,它会使其减半,即62
第二个卷积块会使你的输出大小变为58
然后你的最后一个Maxpool会使其变为29…
所以最终展平的输出将是29*29*16
,其中16是输出通道数