【问题标题】:Beginner PyTorch : RuntimeError: size mismatch, m1: [16 x 2304000], m2: [600 x 120]初学者 PyTorch:RuntimeError:大小不匹配,m1:[16 x 2304000],m2:[600 x 120]
【发布时间】:2020-06-11 23:09:21
【问题描述】:

我是 PyTorch 的初学者,一般都在构建神经网络,但我有点卡住了。

我有这个 CNN 架构:

class ConvNet(nn.Module):

    def __init__(self, num_classes=10):
        super(ConvNet, self).__init__()

        self.conv1 = nn.Conv2d(
            in_channels=3, 
            out_channels=16, 
            kernel_size=3)

        self.conv2 = nn.Conv2d(
            in_channels=16, 
            out_channels=24, 
            kernel_size=4)

        self.conv3 = nn.Conv2d(
            in_channels=24, 
            out_channels=32, 
            kernel_size=4)

        self.dropout = nn.Dropout2d(p=0.3)

        self.pool = nn.MaxPool2d(2)

        self.fc1 = nn.Linear(600, 120)
        self.fc2 = nn.Linear(512, 10)

        self.final = nn.Softmax(dim=1)

    def forward(self, x):

        # conv 3 layers

        x = F.max_pool2d(F.relu(self.conv1(x)), 2)  # output of conv layers
        x = self.dropout(x)

        x = F.max_pool2d(F.relu(self.conv2(x)), 2)  # output of conv layers
        x = self.dropout(x)

        x = F.max_pool2d(F.relu(self.conv3(x)), 2)  # output of conv layers
        x = self.dropout(x)

        # linear layer

        x = F.interpolate(x, size=(600, 120))
        x = x.view(x.size(0), -1)

        x = self.fc1(x) 

        return x

但是当我尝试使用我的图像进行训练时,它不起作用,并且出现此错误:

RuntimeError: size mismatch, m1: [16 x 2304000], m2: [600 x 120]

我想添加第二个线性层 (self.fc2) 以及最终的 SoftMax 层 (self.final),但由于我被困在第一个线性层,我无法取得任何进展。

【问题讨论】:

  • 在我的 DataLoader 中写成 batch_size=16
  • 我不确定,你能告诉我如何找到这个吗?
  • 好的。我在第一层之前和每一层之后添加了一行print(x.shape)。所以我总共有 5 条打印线,输出如下:torch.Size([16, 3, 256, 256])torch.Size([16, 16, 127, 127])torch.Size([16, 24, 62, 62])torch.Size([16, 32, 29, 29])torch.Size([16, 2304000])
  • 好的,我刚改了。以下是新的输出:torch.Size([16, 3, 256, 256])torch.Size([16, 16, 127, 127])torch.Size([16, 24, 62, 62])torch.Size([16, 32, 30, 30])torch.Size([16, 2304000])

标签: python tensorflow neural-network artificial-intelligence pytorch


【解决方案1】:

self.fc1 的输入维度需要与展平张量的特征(第二)维度相匹配。所以不用self.fc1 = nn.Linear(600, 120),你可以用self.fc1 = nn.Linear(2304000, 120)替换它。

请记住,由于您使用的是全连接层,因此模型不能是输入大小不变的(与全卷积网络不同)。如果您在x = x.view(x.size(0), -1) 之前更改了通道的大小或空间维度(就像您从上一个问题移到这个问题一样),self.fc1 的输入维度将必须相应更改。

【讨论】:

  • 谢谢,现在可以使用了。我有两个问题: 1. 它似乎非常慢,在 Google Colab 上运行了 300 万之后,我才从 Epoch 1 开始第 52 批。我想做 10 个 epoch,但我觉得这需要 3 个小时?这正常吗? 2. 模型是如何“保存”的?我知道有一个函数可以用torch.save(model.state_dict(), PATH) 保存它,但是在将它用于训练数据集之后,我如何将它用于我的测试数据集?谢谢。
  • 您可以尝试增加批量大小(如果内存允许)以加快计算速度。仔细检查一下,你是用 cuda 运行的吗?
  • 您通常会保存state = {"model": model.state_dict(), "optimizer": optimizer.state_dict()} 之类的内容以及您想要保留的任何变量。然后可以通过checkpoint = torch.load(pt file)model.load_state_dict(checkpoint["model"]) 等加载。
  • 非常感谢!我没有用 Cuda 运行它,现在我研究并实现了它,它快了 10 倍!
  • 你知道为什么我的损失没有减少吗?它从 0.002 开始,并且在任意次数的迭代中都保持不变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2019-05-18
  • 2019-06-10
  • 2019-07-25
相关资源
最近更新 更多