首先,我使用numpy创建一个ndarray数组:
>>>a = np.array([1.0,2.0])
>>>a.dtye
dtype('float64')
这没什么问题,可以看出numpy默认创建的浮点数类型是float64
接下来,我将ndarray数组转化成PyTroch的tensor
>>>b = torch.tensor(a)
>>>b
tensor([1., 2.], dtype=torch.float64)
看起来似乎没问题?但是这时候你查看一下b是什么类型的tensor
>>>b.type()
'torch.DoubleTensor'
看到了吗,当ndarray的类型是float64时,就转化为torch.DoubleTensor了
而当你使用
>>>b = torch.Tensor(a)
>>>b
tensor([1., 2.])
>>>b.type()
'torch.FloatTensor'
可以看出,torch.Tensor是默认将其转化成FloatTensor的,这没问题,因为torch.Tensor其实等价于torch.FloatTensor。
关于torch.Tensor和torch.tensor的区别可以看我的上一篇博客torch.Tensor和torch.tensor有什么区别。
这时问题来了:当你在pycharm中使用torch.Tensor的时候,会有一个inspection info提示你传入的参数和Tensor声明的参数不一样,但是代码运行起来是没问题的。我去查看了PyTorch的文档,里面写着torch.Tensor(*size),也就是传入的是size,创建一个维度为size的FloatTensor,示例如下:
>>>torch.Tensor(2,3)
tensor([[0., 0., 0.],
[0., 0., 0.]])
但其实它也是能够传入ndarray数组转化成FloatTensor的(就如上面所示),所以这一点应该是Pycharm的问题,莫名其妙的提示我参数不对。。。
一开是我就按照他的提示,改成了torch.tensor(),然后当我模型训练的时候,报错了:
Expected object of scalar type Float but got scalar type Double for argument #4 'mat1'
说的是我的神经网络torch.nn.Linear()`传入的应该是要一个Float类型的变量而实际传入的是Double类型的变量,所以根据上面我们可以知道
torch.tensor(data)是将类型为float64的ndarray转化成DoubleTensor类型的tensor,但是好像torch.nn.Linear()中使用的tensor需要的是FloatTensor,所以就会报错,因此你需要将其改成FloatTensor。torch.Tensor(data)可以将其转换为FloatTensor,并且可以成功运行,但是Pycharm不知道为什么抽风了提示我参数不对,看着我很难受。- 最后,做了折衷,该成如下的代码
torch.tensor(data, dtype=torch.float32),可以成功运行并且也不报错了。
在使用PyCharm进行PyTorch编程时,遇到一个关于数据类型的提示错误。从numpy数组转化为PyTorch tensor时,PyCharm提示参数不匹配,但实际上代码可以正常运行。问题出在PyCharm对于`torch.tensor()`的理解,虽然它能接受数组并创建Tensor,但在某些情况下会给出错误提示。解决方法是明确指定数据类型,将DoubleTensor转为FloatTensor以符合模型输入要求,但PyCharm仍然显示错误提示。最终通过代码妥协实现无误运行。
1048

被折叠的 条评论
为什么被折叠?



