1. 程式人生 > 其它 >Pytorch中tensor的列印精度

Pytorch中tensor的列印精度

技術標籤:筆記pythonpytrochtensor資料精度

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