【问题标题】:RuntimeError: Expected object of type torch.DoubleTensor but found type torch.FloatTensor for argument #2 'weight'RuntimeError:预期的类型为 torch.DoubleTensor 的对象,但为参数 #2 'weight' 找到了类型 torch.FloatTensor
【发布时间】:2018-08-30 15:07:33
【问题描述】:

我的输入张量是 torch.DoubleTensor 类型。但我得到了下面的 RuntimeError:

RuntimeError: Expected object of type torch.DoubleTensor but found type torch.FloatTensor for argument #2 'weight'

我没有明确指定权重的类型(即我没有自己初始化权重。权重是由 pytorch 创建的)。什么会影响转发过程中权重的类型?

非常感谢!!

【问题讨论】:

  • 在我通过 .float() 将输入类型转移到 FloatTensor 之后。代码可以正确处理。但是我还是不知道如果要doubletensor类型输入怎么办……

标签: pytorch


【解决方案1】:

weightsbiases 的默认类型是 torch.FloatTensor。因此,您需要将模型转换为 torch.DoubleTensor 或将输入转换为 torch.FloatTensor。为了投射您的输入,您可以这样做

X = X.float()

或将您的完整模型转换为 DoubleTensor as

model = model.double()

您还可以使用

为所有张量设置默认类型
pytorch.set_default_tensor_type('torch.DoubleTensor')

最好将您的输入转换为float,而不是将您的模型转换为double,因为double 数据类型的数学计算在GPU 上要慢得多。

【讨论】:

  • 非常感谢您的回答!!顺便说一句,我遇到了另一个关于加载模型的问题。使用model = torch.load("file.pth")时IDE报UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 918: ordinal not in range(128)错误(ps:.pth文件来自某个地方,不是我自己训练的。我自己训练的pth文件可以使用torch.load加载)。再次感谢!
  • 这可能是因为模型是使用 Python3 创建(并保存)的,其默认编码为 utf-8,但您使用的是 Python2。在你的 python 文件顶部添加# -*- coding: utf-8 -*-。此外,保存和加载完整模型也不是一个好习惯。这可以通过多种方式打破。有关模型的正确序列化,请参阅official post
  • 非常感谢。但我正在使用 python3 ......并且我在我的 pyhton 文件顶部添加了-*- coding: utf-8 -*-。它不起作用...
  • 然后你可以尝试在python2中加载模型。更多详情可以参考GitHub上的this issue
  • 对我来说,torch0.4.1 不是 pytorch.set(...) 而是 torch.set(...)
【解决方案2】:

我也收到完全相同的错误。根本原因原来是我的数据加载代码中的这句话:

t = t.astype(np.float)

这里 np.float 转换为映射到 DoubleTensor 的 64 位浮点数。所以把它改成,

t = t.astype(np.float32)

解决了这个问题。

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2019-01-11
    • 2020-06-15
    • 2019-09-22
    • 2020-12-02
    • 2020-10-21
    相关资源
    最近更新 更多