mat1和mat2的形状无法相乘

我是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是输出通道数

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注