不吹不黑,记录一个pytorch的类型相关的问题:
在C语言中,整数与浮点数运算,整数会被提升为浮点数。于是在pytorch中,我就写下了如下的代码:
import torch
import numpy as np
a = torch.from_numpy(np.asarray([2]))
b = a / 3.0
本来以为,a是个整型变量,用它去除以一个浮点数,a应该会强制转化为浮点数类型吧?但是,运行结果告诉我,b是一个整型的Tensor,而且值为0!
也就是说,在pytorch里面,整数除以浮点数会被转化为整数除以整数!!!
坑,这是我用来算准确率的一段代码,然后我就看着准确率一直是0,求我的内心的阴影面积。。。。。。
查看pytorch的源码发现,这货在做除法的时候,会进行隐式类型转换,比如现有的版本里面,会把自己转化为小数,再取倒数后乘以除数,然后再转化为自己的类型!!!怕了怕了。
总之,在pytorch里面,不要让两个类型不同的东西做任何运算,其中涉及到的隐式转换可太坑了。。。
顺便说一句,在JavaScript里面是没有整数的,所以JS里面 。
1 / 2 === 0
再顺便说一句,Python2和Python3的整数除法是不一样的。
顺便再说一句,由于pytorch的隐式类型转换,整数除以小数可能会发生除0异常:
import torch
x = torch.arange(end=2)
print(x / 0.1)
这里0.1会被转化成整数类型,也就是0。 =_=!
详见 这个issue