torch.float32 和 numpy 的 float32 有什么不同吗?



PyTorch中设置精度为30显示:

>>> torch.set_printoptions(precision=30)
>>> y
tensor([[-0.388252139091491699218750000000, -0.610148549079895019531250000000,
-1.333969473838806152343750000000, -1.027917861938476562500000000000,
-0.498563587665557861328125000000, -0.096793495118618011474609375000,
-0.895992159843444824218750000000, -0.752071321010589599609375000000,
-0.879653215408325195312500000000],
[ 1.960780262947082519531250000000,  0.290681242942810058593750000000,
0.111534759402275085449218750000, -1.412155270576477050781250000000,
1.015806078910827636718750000000,  0.201809123158454895019531250000,
0.131465137004852294921875000000, -1.262379050254821777343750000000,
-0.480409622192382812500000000000],
[ 0.111068181693553924560546875000, -2.129202365875244140625000000000,
0.538800299167633056640625000000,  1.165832757949829101562500000000,
0.194993987679481506347656250000, -1.110693812370300292968750000000,
-1.451576709747314453125000000000, -3.398952484130859375000000000000,
2.022404193878173828125000000000],
[-2.374018669128417968750000000000, -1.442466974258422851562500000000,
-0.406166225671768188476562500000,  0.045908458530902862548828125000,
-0.835370421409606933593750000000, -0.302138328552246093750000000000,
-0.421340197324752807617187500000,  0.931307554244995117187500000000,
1.061386585235595703125000000000],
[ 1.166660070419311523437500000000,  0.710260510444641113281250000000,
1.008558034896850585937500000000,  1.957847237586975097656250000000,
-1.070753335952758789062500000000,  0.319442749023437500000000000000,
-1.140496969223022460937500000000, -1.723430752754211425781250000000,
0.109533369541168212890625000000],
[ 0.501820147037506103515625000000,  0.349833250045776367187500000000,
-0.073374643921852111816406250000, -2.459295272827148437500000000000,
-1.853959321975708007812500000000,  0.153838425874710083007812500000,
-1.860147237777709960937500000000, -0.880943417549133300781250000000,
-1.352821707725524902343750000000]])

但在numpy设置精度如30所示:

>>> np.set_printoptions(precision=30)
>>> y.numpy()
array([[-0.38825214 , -0.61014855 , -1.3339695  , -1.0279179  ,
-0.4985636  , -0.096793495, -0.89599216 , -0.7520713  ,
-0.8796532  ],
[ 1.9607803  ,  0.29068124 ,  0.11153476 , -1.4121553  ,
1.0158061  ,  0.20180912 ,  0.13146514 , -1.262379   ,
-0.48040962 ],
[ 0.11106818 , -2.1292024  ,  0.5388003  ,  1.1658328  ,
0.19499399 , -1.1106938  , -1.4515767  , -3.3989525  ,
2.0224042  ],
[-2.3740187  , -1.442467   , -0.40616623 ,  0.04590846 ,
-0.8353704  , -0.30213833 , -0.4213402  ,  0.93130755 ,
1.0613866  ],
[ 1.1666601  ,  0.7102605  ,  1.008558   ,  1.9578472  ,
-1.0707533  ,  0.31944275 , -1.140497   , -1.7234308  ,
0.10953337 ],
[ 0.50182015 ,  0.34983325 , -0.073374644, -2.4592953  ,
-1.8539593  ,  0.15383843 , -1.8601472  , -0.8809434  ,
-1.3528217  ]], dtype=float32)e

为什么结果不同?

默认情况下,如果将浮点值与相同数据类型的其他值区分开来所需的位数少于precision的配置值,NumPy将只打印所需的数字。您必须将floatmode选项设置为'fixed'才能获得预期的行为:

numpy.set_printoptions(precision=30, floatmode='fixed')

请注意,即使打印30个十进制数字,32位浮点值也不会有接近该级别的精度。

最新更新