什么是PyTorch?
PyTorch是Facebook人工智能團隊開發的一個機器學習和深度學習工具,用於處理大規模圖像分析,包括物體檢測,分割與分類。但是它的功能不僅限於此。它與其它深度學習框架結合,能夠完成復雜的算法。PyTorch用Python和C++編寫。
PyTorch屬於深度學習框架中的重要一員,與TensorFlow, Keras, Theano等其它深度學習框架不同,它是動態計算圖模式,其應用模型支持在運行過程中根據運行參數動態改變,而其它框架都是靜態計算圖模式,其模型在運行之前就已經確定。以下是各個深度學習框架的熱度對比:
關於各個深度學習框架的對比,可以參考網址:Comparison of deep learning software
。
PyTorch是使用GPU和CPU優化的深度學習張量庫。
下面,我們將一起來學習PyTorch中向量(Tensor)的相關操作。
安裝與運行
PyTorch的安裝十分簡單,需要用pip安裝即可:
pip3 install torch
pip3 install torchvision
其中torchvision包含了一些torch內置的圖片與視頻數據集。
用以下的Python代碼可以輸出安裝的PyTorch版本信息:
import torch
print(torch.version.__version__)
在筆者的電腦上,輸出的結果如下:
1.0.1.post2
向量的基本操作
導入模塊
檢測是否為PyTorch中的向量
is_tensor()函數可以檢測某個序列是否為PyTorch中的向量,is_storage()可以檢測某個序列是否被存儲為PyTorch中的向量。
可以看到,Python中的列表並不是PyTorch中的向量,也不會被存儲為PyTorch中的向量。那么,如何創建PyTorch中的向量呢?
創建隨機向量
利用randn()函數可以創建隨機向量,隨機數為0~1的隨機浮點數,可以指定創建的向量的維數。
可以看到,我們創建了1*2*3維的向量,用size()函數可以查看向量的維數情況,用numel()函數可以查看向量中的所有元素個數。
創建零向量
利用zeros()函數可以創建零向量,即所有元素均為零的向量,只需指定向量的維數即可。
在上面,我們創建了4*4的零向量。
創建單位向量
利用eye()函數可以創建單位向量,即主對角元素為1,其余元素均為零的向量,只需指定向量的維數即可。當二維向量的行數與列數不一樣時,主對角元素為1,其余為0。
從numpy中創建向量
PyTorch支持直接從numpy中創建向量,這為PyTorch和numpy提供了無縫對接,這也是PyTorch的一個優勢。
當然,PyTorch也可以將向量轉化為numpy中的ndarrays.
Tensor函數創建向量
可以利用Tensor()直接創建向量。
linspace與logspace創建向量
linspace(tart, end, steps=100, out=None)通過指定開始值、終值和元素個數創建表示等差數列的一維數組,可以通過endpoint參數指定是否包含終值,默認值為True,即包含終值。
logspace(tart, end, steps=100, out=None)返回一個1維張量,包含在區間10exp(start)和10exp(end)上以對數刻度均勻間隔的 steps個點。
創建均勻分布向量
rand()函數可以創建指定維數的滿足均勻分布的向量。
隨機整數排列向量
randperm(n, out=None) ,給定參數n,返回一個從0 到n -1 的隨機整數排列。
等差數列向量
arange(start, end, step=1, out=None) , 返回一個1維張量,包含從start到end,以step為步長的一組序列值(默認步長為1)。
尋找最大值、最小組
argmin()和argmax()函數可以尋找向量所在的最小值和最大值的下標,0表示沿着行查找,1表示沿着列查找。
向量拼接
cat()函數在給定維度上對輸入的張量序列seq 進行連接操作,默認的維度為0,即按行拼接。
向量分塊
chunk(tensor, chunks, dim=0)函數在給定維度(軸)上將輸入張量進行分塊,默認為0,即按行進行分塊。
gather()函數
gather(input, dim, index, out=None), 沿給定軸dim,將輸入索引張量index指定位置的值進行聚合。gather()函數理解起來比較困難,先看例子,再解釋:
gather的作用是這樣的,index是索引,具體是行還是列的索引要看前面dim ,比如對於我們的例子, [[11, 12], [23, 24]], 指定dim=1,也就是橫向,那么索引就是列號。index的大小就是輸出的大小,所以比如index是[[0,0], [1,0]],那么看index第一行,0列指的是11,同理,第二行為1, 0 , 這樣就是[24, 23],參考這樣的解釋看上面的輸出結果,即可理解gather的含義。
索引
index_select(input, dim, index, out=None) ,沿着指定維度對輸入進行切片,取index中指定的相應項(index為一個LongTensor),然后返回到一個新的張量,返回的張量與原始張量_Tensor_有相同的維度(在指定軸上)。
split()函數
split(tensor, split_size, dim=0), 將輸入張量分割成相等形狀的chunks(如果可分)。 如果沿指定維的張量形狀大小不能被split_size整分, 則最后一個分塊會小於其它分塊。
向量轉置
二維向量的轉置可以用t()或transpos(1, 0)實現。
unbind()
unbind(tensor, dim=0), 移除指定維后,返回一個元組,包含了沿着指定維切片后的各個切片,默認維度為1,表示行,1表示列。
判斷是否為零元素
nonzero()函數可以判斷向量中的元素是否為0.
向量運算
以下將演示幾種常見的矩陣運算。
矩陣的點乘與矩陣乘法
總結
本文的github地址為:https://github.com/percent4/PyTorch_Learning/blob/master/pytorch_tensor_demo.ipynb 。
注意:不妨了解下筆者的微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape), 歡迎大家關注~