首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RuntimeError: mat1和mat2形状不能相乘(25x340和360 x1)

RuntimeError: mat1和mat2形状不能相乘(25x340和360 x1)
EN

Stack Overflow用户
提问于 2022-03-10 11:36:57
回答 1查看 88关注 0票数 0

我收到了这条错误信息,但我不知道为什么。我的输入来自表格数据(批处理,1,312),这个CNN是为回归预测而构造的。我用公式(input + 2*padding - filter size)/stride + 1计算了每个步骤的形状,如下面的注释所示。这个问题似乎发生在x = self.fc(x),我不知道为什么。非常感谢你的帮助。谢谢。

代码语言:javascript
复制
class CNNWeather(nn.Module):
    # input (batch, 1, 312)
    def __init__(self):
        super(CNNWeather, self).__init__()
        self.conv1 = nn.Conv1d(in_channels=1, out_channels=8, kernel_size=9, stride=1, padding='valid')         # (312+2*0-9)/1 + 1 = 304
        self.pool1 = nn.AvgPool1d(kernel_size=2, stride=2)                                                      # 304/2 = 302
        self.conv2 = nn.Conv1d(in_channels=8, out_channels=12, kernel_size=3, stride=1, padding='valid')        # (302-3)/1+1 = 300
        self.pool2 = nn.AvgPool1d(kernel_size=2, stride=2)                                                      # 300/2 = 150
        self.conv3 = nn.Conv1d(in_channels=12, out_channels=16, kernel_size=3, stride=1, padding='valid')       # (150-3)/1+1 = 76
        self.pool3 = nn.AvgPool1d(kernel_size=2, stride=2)                                                      # 76/2 = 38
        self.conv4 = nn.Conv1d(in_channels=16, out_channels=20, kernel_size=3, stride=1, padding='valid')       # (38-3)/1+1 = 36
        self.pool4 = nn.AvgPool1d(kernel_size=2, stride=2)                                                      # 36/2 = 18  (batch, 20, 18)
        self.fc = nn.Linear(in_features=20*18, out_features=1)

    def forward(self, x):
        x = self.pool1(F.relu(self.conv1(x)))
        x = self.pool2(F.relu(self.conv2(x)))
        x = self.pool3(F.relu(self.conv3(x)))
        x = self.pool4(F.relu(self.conv4(x)))
        print(x.size())
        x = x.view(x.size(0), -1)               # flatten   (batch, 20*18)
        x = self.fc(x)
        return x
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-10 11:51:33

这个问题似乎与FC层的输入大小有关:

代码语言:javascript
复制
self.fc = nn.Linear(in_features=20*18, out_features=1)

上一层的输出为340,因此必须使用in_features=340

这些是第三层和第四层输出的形状。

代码语言:javascript
复制
torch.Size([5, 16, 73]) conv3 out
torch.Size([5, 16, 36]) pool3 out
torch.Size([5, 20, 34]) conv4 out
torch.Size([5, 20, 17]) pool4 out

注意,从"pool4“层中出现了20x17,这意味着340个元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71423498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档