Pytorch中tensor的打印精度

本文围绕Pytorch中tensor数据精度展开。介绍了设置打印精度,指出单精度浮点数默认只能提供7位有效数字;说明类型转换不提升精度,重新定义双精度浮点数可获合适精度;还提到数据整体精度情况,并给出设置默认数据类型及打印精度的建议。

1. 设置打印精度

Pytorch中tensor打印的数据长度需要使用torch.set_printoptions(precision=xx)进行设置,否则打印的长度会很短,给人一种精度不够的错觉:

>>> import torch
>>> a=torch.tensor([1/3])
>>> a
tensor([0.3333])
>>> # 修改打印精度为20位小数
>>> torch.set_printoptions(precision=20)
>>> a
tensor([0.33333334326744079590])

如上代码,虽然将打印精度设置为20位小数,但是对于tentor默认的单精度浮点数[1]来说,只能提供7位有效数字[2]。因此,将打印精度设为20位小数也最多只有7位数字有效,多出来的数字没有意义

2. 类型转换对精度的影响

这里考虑使用类型转换将单精度浮点转换为双精度浮点:

>>> # 将单精度浮点转换为双精度浮点
>>> c=a.double()
>>> c
tensor([0.33333334326744079590], dtype=torch.float64)

可以看到,使用类型转换并不会提升数据精度

3. 重新定义高精度数据类型

那么,重新定义一个双精度的浮点数会怎么样呢?

>>> # 使用双精度浮点类型重新生成
>>> b=torch.tensor([1/3],dtype=torch.double)
>>> b
tensor([0.33333333333333331483], dtype=torch.float64)

果然,重新定义的数据拥有了正确合适的精度

4. 数据整体精度是否变化

此时,将数据加上100,可以看到小数后的精度变低了,但是数据整体精度保持不变

>>> # 测试精度位数变化情况
>>> d=100+b
>>> d
tensor([100.33333333333332859638], dtype=torch.float64)

5. 建议

  1. 使用torch.set_default_dtype(torch.double)设置默认的数据类型为双精度浮点,使用torch.set_default_tensor_type(torch.DoubleTensor)在设置默认数据类型的同时会设置torch.tensor接口的默认类型。[3][4]
  2. 对单精度浮点,为稳妥起见,根据输入内容设置打印精度为6位有效数字,同样对双精度浮点,根据输入内容设置设置打印精度为16位有效数字。这样,打印出来的值就是较为精确的值了。

6. 参考

[1]python与pytorch的数据类型、数据精度与转换
[2]谈谈关于Python里面小数点精度控制的问题
[3]torch.set_default_tensor_type
[4]How to use double as the default type for floating numbers in PyTorch

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值