Pytorch 上的 1D CNN:mat1 和 mat2 形状不能相乘(10x3 和 10x2)

Posted

技术标签:

【中文标题】Pytorch 上的 1D CNN:mat1 和 mat2 形状不能相乘(10x3 和 10x2)【英文标题】:1D CNN on Pytorch: mat1 and mat2 shapes cannot be multiplied (10x3 and 10x2) 【发布时间】:2021-05-02 20:56:27 【问题描述】:

我有一个包含 500 个大小的样本和 2 种标签的时间序列,并且想要构建一个带有 pytorch 的 1D CNN:

class Simple1DCNN(torch.nn.Module):
    def __init__(self):
        super(Simple1DCNN, self).__init__()
        self.layer1 = torch.nn.Conv1d(in_channels=50, 
                                      out_channels=20, 
                                      kernel_size=5, 
                                      stride=2)
        self.act1 = torch.nn.ReLU()
        self.layer2 = torch.nn.Conv1d(in_channels=20, 
                                      out_channels=10, 
                                      kernel_size=1)
        
        self.fc1 = nn.Linear(10* 1 * 1, 2)
    def forward(self, x):
        x = x.view(1, 50,-1)
        x = self.layer1(x)
        x = self.act1(x)
        x = self.layer2(x)
        x = self.fc1(x)
        
        return x

model = Simple1DCNN()
model(torch.tensor(np.random.uniform(-10, 10, 500)).float())

但收到此错误消息:

Traceback (most recent call last):
  File "so_pytorch.py", line 28, in <module>
    model(torch.tensor(np.random.uniform(-10, 10, 500)).float())
  File "/Users/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
    result = self.forward(*input, **kwargs)
  File "so_pytorch.py", line 23, in forward
    x = self.fc1(x)
  File "/Users/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
    result = self.forward(*input, **kwargs)
  File "/Users/lib/python3.8/site-packages/torch/nn/modules/linear.py", line 93, in forward
    return F.linear(input, self.weight, self.bias)
  File "/Users/lib/python3.8/site-packages/torch/nn/functional.py", line 1692, in linear
    output = input.matmul(weight.t())
RuntimeError: mat1 and mat2 shapes cannot be multiplied (10x3 and 10x2)

我做错了什么?

【问题讨论】:

【参考方案1】:

x = self.layer2(x)(也是下一行x = self.fc1(x)的输入)的输出形状为torch.Size([1, 10, 3])

现在根据self.fc1 的定义,它期望输入的最后一个维度是10 * 1 * 1,即10,而您的输入有3,因此会出现错误。

我不知道你想做什么,但假设你想做的是;

    将整个500 大小序列标记为两个标签之一,您可以这样做。
# replace self.fc1 = nn.Linear(10* 1 * 1, 2) with
self.fc1 = nn.Linear(10 * 3, 2)

# replace x = self.fc1(x) with
x = x.view(1, -1)
x = self.fc1(x)
    10 时间步分别标记为两个标签之一,然后执行此操作。
# replace self.fc1 = nn.Linear(10* 1 * 1, 2) with
self.fc1 = nn.Linear(2, 2)

1 的输出形状为 (batch size, 2),2 的输出形状为 (batch size, 10, 2)。

【讨论】:

以上是关于Pytorch 上的 1D CNN:mat1 和 mat2 形状不能相乘(10x3 和 10x2)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV:如何有效地将 Mat2d 矩阵的每个元素乘以 Mat1d 矩阵

我不明白 conv1d、conv2d 的 pytorch 输入大小

三维几何学习从零开始网格上的深度学习-2:卷积网络CNN篇(Pytorch)

VGG——CNN经典网络模型(pytorch实现)

比用Pytorch框架快200倍!0.76秒后,笔记本上的CNN就搞定了MNIST | 开源

比用Pytorch框架快200倍!0.76秒后,笔记本上的CNN就搞定了MNIST | 开源