在Pytorch预期双张量(得到Float张量)

时间:2017-10-03 13:49:25

标签: machine-learning neural-network conv-neural-network pytorch

我想在Pytorch中创建nn.Module。我使用以下代码来解决与文本相关的问题(实际上我使用Glove 300d预训练嵌入和句子中的单词加权平均来进行分类)。

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv1d(300, 128, kernel_size=5)
        self.conv2 = nn.Conv1d(128, 64, kernel_size=2)
        self.conv2_drop = nn.Dropout()
        self.fc1 = nn.Linear(64, 20)
        self.fc2 = nn.Linear(20, 2)

    def forward(self, x):
        x = F.relu(F.avg_pool1d(self.conv1(x), 2))
        x = F.relu(F.avg_pool1d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 1)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        return self.fc2(x)

但它给了我以下错误:

Traceback (most recent call last):
    x = F.relu(F.avg_pool1d(self.conv1(x), 2))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/torch/nn/modules/module.py", line 224, in __call__
    result = self.forward(*input, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/torch/nn/modules/conv.py", line 154, in forward
    self.padding, self.dilation, self.groups)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/torch/nn/functional.py", line 83, in conv1d
    return f(input, weight, bias)
RuntimeError: expected Double tensor (got Float tensor)

我对Conv1d相当新,并且大多数教程使用Conv1d来解决图像问题。谁能让我知道这是什么问题?

我还在forward方法中添加了model.double(),但又给了我一个错误:

RuntimeError: Given input size: (300 x 1 x 1). Calculated output size: (128 x 1 x -3). Output size is too small

1 个答案:

答案 0 :(得分:4)

错误1

  

RuntimeError:预期双张量(得到浮点张量)

将双张量传递给第一个conv1d函数时会发生这种情况。 Conv1d仅适用于浮动张量。 要么这样做,

  1. conv1.double()
  2. model.double()
  3. 你做了什么,这是正确的。

    错误2

      

    RuntimeError:给定输入大小:(300 x 1 x 1)。计算输出尺寸:(128 x 1 x -3)。输出尺寸太小

    这是因为您传递的输入窗口大小为5的卷积无效。您必须向Conv1d添加填充才能使其正常工作,如下所示:

    self.conv1 = nn.Conv1d(300, 128, kernel_size=5, padding=2)
    

    如果你不想添加填充,那么给定(batch_size,in_channels,inp_size)作为输入张量的大小,你必须确保你的inp_size大于5。

    所有修复程序合并

    确保您的尺寸对于网络的其他部分是正确的。像这样:

    class Net(nn.Module):
        def __init__(self):
            super(Net, self).__init__()
            self.conv1 = nn.Conv1d(300, 128, kernel_size=5, padding=2)
            self.conv2 = nn.Conv1d(128, 64, kernel_size=2, padding=1)
            self.conv2_drop = nn.Dropout()
            self.fc1 = nn.Linear(64, 20)
            self.fc2 = nn.Linear(20, 2)
    
        def forward(self, x):
            x = F.relu(F.avg_pool1d(self.conv1(x), 2, padding=1))
            x = F.relu(F.avg_pool1d(self.conv2_drop(self.conv2(x)), 2))
            x = x.view(1, -1) # bonus fix, Linear needs (batch_size, in_features) and not (in_features, batch_size) as input.
            x = F.relu(self.fc1(x))
            x = F.dropout(x, training=self.training)
            return self.fc2(x)
    
    if __name__ == '__main__':
    
        t = Variable(torch.randn((1, 300, 1))).double() # t is a double tensor
        model = Net()
        model.double() # this will make sure that conv1d will process double tensor
        out = model(t)