[Python/PyTorch基礎] PyTorch學習筆記

PyTorch採用Python語言接口來實現編程,它就像帶GPU的Numpy,與Python一樣都屬於動態框架。PyTorch繼承了Torch靈活、動態的編程環境和用戶友好的界面,支持以快速和靈活的方式構建動態神經網絡,還允許在訓練過程中快速更改代碼而不妨礙其性能,支持動態圖形等尖端AI模型的能力,是快速實驗的理想選擇。

PyTorch由4個主要的包組成:

  • torch:類似於Numpy的通用數組庫,可將張量類型轉換爲torch.cuda.TensorFloat,並在GPU上進行計算。
  • torch.autograd:用於構建計算圖形並自動獲取梯度的包。
  • torch.nn:具有共享層和損失函數的神經網絡庫。
  • torch.optim:具有通用優化算法(如SGD、Adam等)的優化包。

Numpy與Tensor

PyTorch的Tensor,它可以是零維(又稱爲標量或一個數)、一維、二維及多維的數組。
Tensor自稱爲神經網絡界的Numpy,它與Numpy相似,二者可以共享內存,且之間的轉換非常方便和高效。它們最大的區別就是Numpy會把ndarray放在CPU中進行加速運算,而由Torch產生的Tensor會放在GPU中進行加速運算(假設當前環境有GPU)。

Tensor概述

接口的角度可以分爲兩類:

  1. torch.function,如 torch.sum、torch.add 等;
  2. tensor.function,如 tensor.view、tensor.add 等。
    這些操作對大部分Tensor都是等價的,比如 torch.add(x, y) 和 x.add(y) 等價。

修改方式的角度可以分爲兩類:

  1. 不修改自身數據,如 x.add(y),x的數據不變,返回一個新的tensor。
  2. 修改自身數據, 如x.add_(y) (運行符下劃線後綴),運算結果存在x中,x被修改。
import torch

x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
z = x.add(y)
print(z)
print(x)
x.add_(y)
print(x)

#結果:
# tensor([4, 6])
# tensor([1, 2])
# tensor([4, 6])

創建Tensor

創建Tensor的方法有很多,可以從列表或ndarray等類型進行構建,也可根據指定的形狀構建。
常見的創建Tensor的方法:

函數 功能
Tensor(*size) 直接從參數構造一個張量,支持list,numpy數組
eye(row, column) 創建指定行數和列數的二維單位Tensor
linspace(start, end, steps) 從start到end,均勻切分成steps份
logspace(start, end, steps) 從10 ^ start到10 ^ end,均勻切分成steps份
rand/randn(*size) 生成[0,1)均勻分佈標準正態分佈數據
ones(*size) 返回指定shape的張量,元素初始爲1
zeros(*size) 返回指定shape的張量,元素初始爲0
ones_like(t) 返回與t的shape相同的張量,元素初始爲1
zeros_like(t) 返回與t的shape相同的張量,元素初始爲0
arange(start, end, steps) 在區間上生成等間距序列張量
from_Numpy(ndarray) 從ndarray創建一個張量

注意torch.Tensor與torch.tensor的幾點區別:

  1. torch.Tensor是torch.empty和torch.tensor之間的一種混合,但是,當傳入數據時,torch.Tensor使用全局默認dtype(FloatTensor),而torch.tensor是從數據中推斷數據類型。
  2. torch.tensor(1)返回一個固定值1,而torch.Tensor(1)返回一個大小爲1的張量,它是隨機初始化的值。

修改Tensor形狀

在處理數據、構建網絡層等過程中,經常需要了解Tensor的形狀、修改Tensor的形狀。
tensor常用修改形狀的函數:

函數 說明
size() 返回張量的shape屬性值
numel(input) 計算元素個數
view(*shape) 修改張量的shape,與reshape類似,但view返回的對象與源張量共享內存。reshape生成新的張量,而且不要求源張量是連續的。view(-1)展平數組
resize 和view類似,但在size超出時重新分配內存空間
item 若Tensor爲單元素,則返回Python的標量
unsqueeze 在指定維度增加一個1
squeeze 在指定維度壓縮一個1

torch.view與torch.reshape的異同:

  1. reshape()可以由torch.reshape(),也可由torch.Tensor.reshape()調用。
    但view()只可由torch.Tensor.view()來調用。
  2. 對於一個將要被view的Tensor,新的size必須與原來的size與stride兼容。否則,在view之前必須調用contiguous()方法。
  3. 同樣也是返回與input數據量相同,但形狀不同的Tensor。若滿足view的條件,則不會copy,若不滿足,則會copy。
  4. 如果只想重塑張量,請使用torch.reshape。
    如果還關注內存使用情況並希望確保兩個張量共享相同的數據,請使用torch.view。

(未完待續……)

更多pytorch用法可參考pytorch中文文檔
本文內容根據《Python深度學習:基於PyTorch》書中第2章內容總結
一起加油吧ヾ(◍°∇°◍)ノ゙

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章