Pytorch 中预期的双张量(得到 Float 张量)
expected Double tensor (got Float tensor) in 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
RuntimeError: expected Double tensor (got Float tensor)
当您将双张量传递给第一个 conv1d
函数时,会发生这种情况。 Conv1d
仅适用于浮点张量。
要么,
conv1.double()
或
model.double()
.
你做的是对的。
错误 2
RuntimeError: Given input size: (300 x 1 x 1). Calculated output size: (128 x 1 x -3). Output size is too small
这是因为您传递的输入是 window 大小为 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)
我想在 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
RuntimeError: expected Double tensor (got Float tensor)
当您将双张量传递给第一个 conv1d
函数时,会发生这种情况。 Conv1d
仅适用于浮点张量。
要么,
conv1.double()
或model.double()
.
你做的是对的。
错误 2
RuntimeError: Given input size: (300 x 1 x 1). Calculated output size: (128 x 1 x -3). Output size is too small
这是因为您传递的输入是 window 大小为 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)