2020-10-02

2020-10-03 13:00:10

PyTorch是什麼?

這是一個基於Python的科學計算包,其旨在服務兩類場合:

  • 替代numpy發揮GPU潛能
  • 一個提供了高度靈活性和效率的深度學習實驗性平臺

 

第一個概念:張量tensors

pytorch下的張量類似於numpy下的陣列,並且張量也可用於在GPU上對程式進行加速

 

建立(5,3)的資料:

陣列:numpy.empty([5, 3])

張量:torch.empty(5, 3)

執行結果:

陣列

張量

note:numpy下建立多維陣列,引數要是一個列表;torch下只需直接輸入數位;同理初始化張量的方式還有ones、zeros。

建立亂數

顯然,pytorch建立亂數更方便

 

建立指定內容的張量

 

張量和陣列的繼承

note:陣列沒有new_ones這種方法

張量和陣列建立正態分佈的資料

note:陣列沒有randn_like這種繼承方式

 

size的用法

陣列和張量的用法是不一樣的,陣列返回元素個數,張量返回其規模,類似於shape

 

add用法(總算來了一個陣列和張量都一樣的用法)

note:注意一下,使用add函數會生成一個新的tensor變數, add_ 函數會直接再當前tensor變數上進行操作,於函數名末尾帶有"_" 的函數都是會對Tensor變數本身進行操作的。add_是針對類的方法,而不能當函數呼叫

 

更改陣列或張量的規模reshape、view

note:對於張量,reshape和view都可以用,但陣列沒有view這個用法

 

張量轉化為陣列

必須要強調一下,陣列和張量相互轉化時候,兩者共用一個儲存地址,因此兩者的相互轉化會非常快

張量轉為陣列

陣列轉為張量 呼叫函數from_numpy

從最後4行結果也可以看出,從陣列轉化而來的張量和陣列共用一個地址

 

張量乘法

矩陣乘法、對應位置相乘

 

張量的增維和減維(擠維) unsqueeze、squeeze

torch.squeeze(input, dim=None, out=None)

1、當不給定dim時,將輸入張量形狀中的1 去除並返回

2、當給定dim時,那麼擠壓操作只在給定維度上,當這個給定的dim為1的時候,才有效,否則,函數是無效的

3、返回張量與輸入張量共用記憶體,所以改變其中一個的內容會改變另一個。

4、dim為負數時候,-1表示最後一個,以此類推,如資料的維度(2,3,1),squeeze(input,-1)降低第二維成(2,3)

torch.unsqueeze(input, dim, out=None)

1、給定的dim是最終生成的dim,不如dim=2,是最終生成的張量中,第二維的大小為1

2、返回張量與輸入張量共用記憶體,所以改變其中一個的內容會改變另一個。

3、dim為負數時候,-1表示最後一個,以此類推,如資料的維度(2,3),unsqueeze(input,-1)降低第二維成(2,3,1)

 

堆疊函數stack:用於擴充套件張量的維數

呼叫格式  d=torch.stack( (a,b,c) ,dim)  其中a、b、c為相同維數的張量,dim為指定的張量堆積方向。如abc分別為二維張量,dim=0,表明形成三維張量後第0維為堆積方向。

先來看一下三維的資料大致的形狀,三維是幾個2維資料按一定方向堆疊起來的,但不管怎麼堆疊,可以始終看成一個長方體

以此類推

以具體例子來看

abc分別為(2,4)的二維張量

當dim=0,表明3張平面向著第0軸的方向堆疊,故容易得出最後的規模為(3,2,4)

然後用資料驗證下:

繼續,當dim=1時,表明3張平面按第1維的方向堆疊,易得出最後的規模(2,3,4)

驗證:

繼續,當dim=2,表明3個平面按第2軸的方向堆疊,容易的出最後的張量規模(2,4,3)

驗證:

需要注意的是,d=torch.stack( (a,b,c) ,dim) ,表示堆疊的時候,按abc的順序依次向著堆疊方向放平面,順序不要錯了。

 

CUDA張量,將張量移送到GPU上進行運算

指令碼的執行時間將比cpu下快很多

 

張量的複製

運用 clone、detach函數

clone():完全複製、開闢新記憶體,仍留在計算圖中,即參與梯度運算

detach():完全複製,和原變數為同一記憶體,但離開計算圖

clone().detach():完全複製,開闢新記憶體,離開計算圖