运行时错误:期望的对象类型为torch.DoubleTensor,但在参数#2 'weight'中发现了类型为torch.FloatTensor。

34

我的输入张量是torch.DoubleTensor类型。但是我收到了以下运行时错误:

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

我没有明确指定权重的类型(即我没有自己初始化我的权重。这些权重是由pytorch创建的)。在前向过程中会影响权重类型的因素是什么?

非常感谢!!


1
在我使用.float()将输入类型转换为FloatTensor后,代码可以正确处理。但是我仍然不知道如果我想要doubletensor类型的输入会怎样...... - Eric Kani
2个回答

39

weightsbiases的默认类型是torch.FloatTensor,所以您需要将模型转换为torch.DoubleTensor或将输入转换为torch.FloatTensor。要转换输入,可以执行以下操作:

X = X.float()

或者将您的完整模型转换为 DoubleTensor,如下所示:

model = model.double()

您还可以使用以下方法为所有张量设置默认类型:

pytorch.set_default_tensor_type('torch.DoubleTensor')

最好将您的输入转换为float而不是将模型转换为double,因为在GPU上处理double数据类型的数学计算速度较慢。


非常感谢您的回答!!顺便说一下,我遇到了另一个有关加载模型的问题。当我使用model = torch.load("file.pth")时,IDE会引发UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 918: ordinal not in range(128)错误(附注:.pth文件来自某个地方,并不是我自己训练的。我自己训练的pth文件可以使用torch.load加载)。再次感谢! - Eric Kani
这可能是因为该模型是使用Python3创建(并保存)的,其默认编码为utf-8,但您正在使用Python2。在您的python文件顶部添加# -*- coding: utf-8 -*-。此外,保存和加载完整模型不是一个好的做法。这可能会以多种方式破坏模型。有关正确序列化模型的信息,请参见官方文章 - layog
非常感谢。但是我正在使用Python3……并且我已经在我的Python文件顶部添加了-*- coding: utf-8 -*-。但它不起作用…… - Eric Kani
1
然后您可以尝试在Python2中加载模型。有关更多详细信息,请参阅GitHub上的此问题。链接 - layog
对于我来说,使用torch0.4.1时,不是pytorch.set(...)而是torch.set(...)。 - tverrbjelke
可能在 0.4.0 中已经更新,而这个代码是适用于 0.3.1 的。欢迎修改,否则我将在最新版本上进行测试并更新答案。 - layog

3
我也遇到了完全相同的错误。根本原因是我数据加载代码中这个语句:
t = t.astype(np.float)

在此,np.float指的是64位浮点数,对应于DoubleTensor。因此,将此更改为:
t = t.astype(np.float32)

解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接