pytorch的隐式类型转换及其坑

不吹不黑,记录一个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的源码发现,这货在做除法的时候,会进行隐式类型转换,比如现有的版本里面,会把自己转化为小数,再取倒数后乘以除数,然后再转化为自己的类型!!!怕了怕了。

除法源码github.com

总之,在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

    原文作者:游凯超
    原文地址: https://zhuanlan.zhihu.com/p/55666519
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞