【问题标题】:Beginner PyTorch - RuntimeError: shape '[16, 400]' is invalid for input of size 9600初学者 PyTorch - RuntimeError:形状 '[16, 400]' 对于大小为 9600 的输入无效
【发布时间】:2020-06-11 20:10:15
【问题描述】:

我正在尝试构建 CNN,但出现此错误:

---> 52         x = x.view(x.size(0), 5 * 5 * 16)
RuntimeError: shape '[16, 400]' is invalid for input of size 9600

我不清楚“x.view”行的输入应该是什么。另外,我真的不明白我的代码中应该有多少次这个“x.view”函数。是不是只有一次,在 3 个卷积层和 2 个线性层之后?或者是 5 次,每层后一个?

这是我的代码:

CNN

import torch.nn.functional as F

# Convolutional neural network
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(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(512, 10)

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

    def forward(self, x):

        print('shape 0 ' + str(x.shape))

        x = F.max_pool2d(F.relu(self.conv1(x)), 2)  
        x = self.dropout(x)

        print('shape 1 ' + str(x.shape))

        x = F.max_pool2d(F.relu(self.conv2(x)), 2)  
        x = self.dropout(x)

        print('shape 2 ' + str(x.shape))

        # x = F.max_pool2d(F.relu(self.conv3(x)), 2)  
        # x = self.dropout(x)

        x = F.interpolate(x, size=(5, 5))  
        x = x.view(x.size(0), 5 * 5 * 16)

        x = self.fc1(x) 

        return x

net = ConvNet()

谁能帮我理解这个问题?

'x.shape' 的输出是:

形状 0 torch.Size([16, 3, 256, 256])

shape 1 torch.Size([16, 16, 127, 127])

形状 2 火炬.Size([16, 24, 62, 62])

谢谢

【问题讨论】:

    标签: neural-network artificial-intelligence pytorch conv-neural-network


    【解决方案1】:

    这意味着通道和空间维度的乘积不是5*5*16。要展平张量,请将x = x.view(x.size(0), 5 * 5 * 16) 替换为:

    x = x.view(x.size(0), -1)
    

    还有self.fc1 = nn.Linear(600, 120) 和:

    self.fc1 = nn.Linear(600, 120)
    

    【讨论】:

    • 感谢您的回答。我应该在每次卷积时压平张量,还是在 3 次卷积后压平一次,或者 5 次(我总共有 5 层),或者..?
    • 张量展平是在你的全连接(线性)层之前完成的,所以你只需要做一次,即在F.interpolate()之后。
    • 我的回答有帮助吗?如果是这样,请随时接受/对此答案投票。
    • 不是真的,我现在遇到另一个错误:RuntimeError: size mismatch, m1: [16 x 800], m2: [600 x 120] 有什么想法吗?
    • 您是否修改了代码/输入大小?你添加了 FC 层吗?
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2021-10-11
    • 2021-08-02
    • 2019-07-31
    • 2020-07-08
    相关资源
    最近更新 更多