1. 程式人生 > 其它 >Pytorch建立Tensor的幾種方式詳解(轉載)

Pytorch建立Tensor的幾種方式詳解(轉載)

原連結:https://blog.csdn.net/qq_28418387/article/details/97971328

作者:AI學渣

前言
tensor是Pytorch中資料的基礎單元,那麼如何建立tensor,pytorch中提供了以下四種方式:

torch.Tensor()
torch.tensor()
torch.as_tensor()
torch.from_numpy()
那麼這四種建立tensor的方式有什麼區別呢,在具體使用中應該如何選擇?

1、型別結構的區別
除了torch.Tensor()是類之外,其他三個都是函式

2、tensor資料型別的區別
可以先舉個例子,首先建立一個numpy陣列,分別使用這四種方式建立tensor,並列印輸出,我們來看看輸出的tensor的區別

從結果可以看出,初始狀態為 整型的numpy陣列,後三個的dtype都變成了torch.int32型別,只有第一個tensor好像變成了浮點型,我們再分別列印他們的dtype型別

torch.Tensor()果然是將整型的numpy陣列轉化成了torch.float32的浮點型別,那麼為什麼會有這樣的轉化呢?實際上,torch.Tensor()是將numpy陣列轉化成了tensor的預設資料型別,我們來看看tensor的預設資料型別是不是torch.float32型別

通過torch.get_default_dtype()函式獲取到了tensor的預設資料型別,果然是torch.float32。

其他三種方法預設的是繼承輸入numpy資料型別,輸入的是int整型,那麼轉化生成的tensor就是整型的,輸入的是float浮點型,那麼轉化生成的就是浮點型

其他三種方法還提供了設定資料型別的引數dtype,在轉換的過程中可以設定成我們想要的資料型別


3、儲存方式的區別
我們接著上面的例子往下看,此時我們修改原numpy陣列中的元素,看看經過四種方法轉換後的tensor會不會有什麼變化

發現了沒有,在修改了原numpy陣列中的元素之後,前兩種方法轉換出來的tensor並沒有發生改變,這符合我們的正常邏輯,因為經過了轉換相當於複製了一份,原陣列的改變就不會影響轉換後的tensor;而後兩種方法轉換出來的tensor本質上是和原陣列共享記憶體的,所以numpy的變化也會導致轉換後的tensor的變化。
那我們現在將變換後的tensor改回原來的值,看看原numpy陣列是否也跟著發生了變化

原numpy陣列也發生了變化!

4、tensor建立方法的選擇
經過對比了之後,那麼平時我們應該如何選擇哪種方法來建立tensor呢?
在不考慮效能方面,一般情況下我們使用**torch.tensor()方法居多,那麼如果要考慮效能方面,首先肯定是要從torch.as_tensor()以及torch.from_numpy()**這兩種方法中選擇,因為在建立tensor的過程中,它倆是共享記憶體的,不需要額外建立一份資料,。
但是這兩個中選擇哪個呢,答案是:torch.as_tensor(),因為torch.as_tensor()和torch.from_numpy()之間有個區別就是,torch.from_numpy()只能接收numpy陣列,而torch.as_tensor()不僅可以接收numpy陣列,還可以接收python的list型別資料