PyTorch是什麼?
這是一個基於Python的科學計算包,其旨在服務兩類場合:
第一個概念:張量tensors
pytorch下的張量類似於numpy下的陣列,並且張量也可用於在GPU上對程式進行加速
陣列:numpy.empty([5, 3])
張量:torch.empty(5, 3)
執行結果:
陣列
張量
note:numpy下建立多維陣列,引數要是一個列表;torch下只需直接輸入數位;同理初始化張量的方式還有ones、zeros。
顯然,pytorch建立亂數更方便
note:陣列沒有new_ones這種方法
note:陣列沒有randn_like這種繼承方式
陣列和張量的用法是不一樣的,陣列返回元素個數,張量返回其規模,類似於shape
add用法(總算來了一個陣列和張量都一樣的用法)
note:注意一下,使用add函數會生成一個新的tensor變數, add_ 函數會直接再當前tensor變數上進行操作,於函數名末尾帶有"_" 的函數都是會對Tensor變數本身進行操作的。add_是針對類的方法,而不能當函數呼叫
note:對於張量,reshape和view都可以用,但陣列沒有view這個用法
必須要強調一下,陣列和張量相互轉化時候,兩者共用一個儲存地址,因此兩者的相互轉化會非常快
張量轉為陣列
從最後4行結果也可以看出,從陣列轉化而來的張量和陣列共用一個地址
矩陣乘法、對應位置相乘
1、當不給定dim時,將輸入張量形狀中的1
去除並返回
2、當給定dim
時,那麼擠壓操作只在給定維度上,當這個給定的dim為1的時候,才有效,否則,函數是無效的
3、返回張量與輸入張量共用記憶體,所以改變其中一個的內容會改變另一個。
4、dim為負數時候,-1表示最後一個,以此類推,如資料的維度(2,3,1),squeeze(input,-1)降低第二維成(2,3)
1、給定的dim是最終生成的dim,不如dim=2,是最終生成的張量中,第二維的大小為1
2、返回張量與輸入張量共用記憶體,所以改變其中一個的內容會改變另一個。
3、dim為負數時候,-1表示最後一個,以此類推,如資料的維度(2,3),unsqueeze(input,-1)降低第二維成(2,3,1)
呼叫格式 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的順序依次向著堆疊方向放平面,順序不要錯了。
指令碼的執行時間將比cpu下快很多
運用 clone、detach函數
clone():完全複製、開闢新記憶體,仍留在計算圖中,即參與梯度運算
detach():完全複製,和原變數為同一記憶體,但離開計算圖
clone().detach():完全複製,開闢新記憶體,離開計算圖