Pytorch RuntimeError: 大小不匹配,m1: [1 x 7744],m2: [400 x 120]

在一个用于分类5个对象的简单CNN中,我遇到了大小不匹配的错误:

"RuntimeError: size mismatch, m1: [1 x 7744], m2: [400 x 120]" in the convolutional layer . 

我的model.py文件如下:

import torch.nn as nnimport torch.nn.functional as Fclass FNet(nn.Module):    def __init__(self,device):        # 这里构建你的卷积神经网络        # 使用正则化        # 批量归一化        super(FNet, self).__init__()        num_classes = 5        self.conv1 = nn.Conv2d(3, 6, 5)        self.conv2 = nn.Conv2d(6, 16, 5)        # 仿射操作:y = Wx + b        self.fc1 = nn.Linear(16 * 5 * 5, 120)        self.fc2 = nn.Linear(120, 84)        self.fc3 = nn.Linear(84, 5)    def forward(self, x):        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))        x = F.max_pool2d(F.relu(self.conv2(x)), 2)        x = x.view(-1, self.num_flat_features(x))        x = F.relu(self.fc1(x))        x = F.relu(self.fc2(x))        x = self.fc3(x)        return x    def num_flat_features(self, x):        size = x.size()[1:]  # 除批次维度之外的所有维度        num_features = 1        for s in size:            num_features *= s        return num_featuresif __name__ == "__main__":    net = FNet()

完整错误信息如下:

Traceback (most recent call last):  File "main.py", line 98, in <module>    train_model('../Data/fruits/', save=True, destination_path='/home/mitesh/E yantra/task1#hc/Task 1/Task 1B/Data/fruits')  File "main.py", line 66, in train_model    outputs = model(images)  File "/home/mitesh/anaconda3/envs/HC#850_stage1/lib/python3.6/site-packages/torch/nn/modules/module.py", line 477, in __call__    result = self.forward(*input, **kwargs)  File "/home/mitesh/E yantra/task1#hc/Task 1/Task 1B/Code/model.py", line 28, in forward    x = F.relu(self.fc1(x))  File "/home/mitesh/anaconda3/envs/HC#850_stage1/lib/python3.6/site-packages/torch/nn/modules/module.py", line 477, in __call__    result = self.forward(*input, **kwargs)  File "/home/mitesh/anaconda3/envs/HC#850_stage1/lib/python3.6/site-packages/torch/nn/modules/linear.py", line 55, in forward    return F.linear(input, self.weight, self.bias)  File "/home/mitesh/anaconda3/envs/HC#850_stage1/lib/python3.6/site-packages/torch/nn/functional.py", line 1024, in linear    return torch.addmm(bias, input, weight.t())RuntimeError: size mismatch, m1: [1 x 7744], m2: [400 x 120] at /opt/conda/conda-bld/pytorch-cpu_1532576596369/work/aten/src/TH/generic/THTensorMath.cpp:2070

回答:

如果你的网络中有一个nn.Linear层,你不能“临时”决定这个层的输入大小。
在你的网络中,你为每个x计算num_flat_features,并期望你的self.fc1能够处理你输入网络的任何x大小。然而,self.fc1有一个大小为400×120的固定大小的权重矩阵(期望输入维度为16*5*5=400,输出120维特征)。在你的情况下,x的大小转换为7744维特征向量,self.fc1无法处理。

如果你希望你的网络能够处理任何大小的x,你可以在self.fc1之前添加一个无参数的插值层,将所有x调整到正确的尺寸:

x = F.max_pool2d(F.relu(self.conv2(x)), 2)  # 卷积层的输出x = F.interpolate(x, size=(5, 5), mode='bilinear')  # 调整大小到线性单元期望的尺寸x = x.view(x.size(0), 5 * 5 * 16)x = F.relu(self.fc1(x))  # 从这里继续...

有关更多信息,请参阅torch.nn.functional.interpolate

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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