我们发现,有的时候,我们使用torch计算一通之后,有的时候得到的是nan,有的时候得到的inf,这是什么鬼?
nan
开门见山,nan不是一个数字,因此没有正负概念,和其他数字比较也没有意义。产生原因:定义域出错。如下:
例子1:
a=torch.tensor([-0.1])
torch.log(a)#log不能对负数操作,定义域越界。
tensor([nan])
例子2:
a=torch.tensor([1.1])
torch.arctanh(a)#反双曲正切定义域为[-1,1]
tensor([nan])
注意:nan由于不是数字,因此任何后续数学运算都会是nan。
inf
inf是一个数字,表示正无穷大,相应的,有-inf。由于是数字,所以可以和其他数字比较大小。产生原因:数字太大,计算机无法表示。
例子1:
a=torch.tensor([100])
torch.exp(a)
tensor([inf])
例子2:
a=torch.tensor([1e-100])
torch.log(a)
tensor([-inf])
注意,其是一个数字,因此,可以作为一个数字继续参与后续运算。
a=torch.tensor([1e100])
b=torch.exp(a)#inf
torch.sigmoid(b)
成功,大家可以试一试,如果b为nan是无法参加后续运算的。
tensor([1.])
补充
偶然发现,除了定义域,nan还有可能有其他产生方式,例如:
a=torch.log((torch.tensor([1e-100])))
a
tensor([-inf])
然后再继续乘以0,就会是nan:
a*0
tensor([nan])
我想,这应该才是为什么我们训练模型的时候,有的时候会nan的原因:其实是先有了inf。