PyTorch入門(一)向量


什么是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的一個優勢。

從numpy直接創建向量

  當然,PyTorch也可以將向量轉化為numpy中的ndarrays.

向量轉化為numpy.ndarrays

Tensor函數創建向量

  可以利用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個點。

linspace() & logspace()

創建均勻分布向量

  rand()函數可以創建指定維數的滿足均勻分布的向量。

rand()

隨機整數排列向量

  randperm(n, out=None) ,給定參數n,返回一個從0 到n -1 的隨機整數排列。

randperm()

等差數列向量

  arange(start, end, step=1, out=None) , 返回一個1維張量,包含從start到end,以step為步長的一組序列值(默認步長為1)。

arange()

尋找最大值、最小組

  argmin()和argmax()函數可以尋找向量所在的最小值和最大值的下標,0表示沿着行查找,1表示沿着列查找。

argmin(), argmax()

向量拼接

  cat()函數在給定維度上對輸入的張量序列seq 進行連接操作,默認的維度為0,即按行拼接。

cat()

向量分塊

  chunk(tensor, chunks, dim=0)函數在給定維度(軸)上將輸入張量進行分塊,默認為0,即按行進行分塊。

chunk()

gather()函數

  gather(input, dim, index, out=None), 沿給定軸dim,將輸入索引張量index指定位置的值進行聚合。gather()函數理解起來比較困難,先看例子,再解釋:

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_有相同的維度(在指定軸上)。

index_select()

split()函數

  split(tensor, split_size, dim=0), 將輸入張量分割成相等形狀的chunks(如果可分)。 如果沿指定維的張量形狀大小不能被split_size整分, 則最后一個分塊會小於其它分塊。

split()

向量轉置

   二維向量的轉置可以用t()或transpos(1, 0)實現。

向量轉置

unbind()

  unbind(tensor, dim=0), 移除指定維后,返回一個元組,包含了沿着指定維切片后的各個切片,默認維度為1,表示行,1表示列。

unbind()

判斷是否為零元素

  nonzero()函數可以判斷向量中的元素是否為0.

nonzero()

向量運算

  以下將演示幾種常見的矩陣運算。

矩陣運算

矩陣的點乘與矩陣乘法

矩陣點乘與矩陣乘法

總結

  本文的github地址為:https://github.com/percent4/PyTorch_Learning/blob/master/pytorch_tensor_demo.ipynb

注意:不妨了解下筆者的微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape), 歡迎大家關注~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM