本文始發於我的公衆號:TechFlow,原創不易,求個關注web
今天是Pytorch專題的第二篇,咱們繼續來了解一下Pytorch中Tensor的用法。api
上一篇文章當中咱們簡單介紹了一下如何建立一個Tensor,今天咱們繼續深刻Tensor的其餘用法。數組
咱們能夠用size()函數或者直接調用tensor當中的shape屬性獲取一個tensor的大小,這二者是等價的,通常狀況下咱們用前者多一些。併發
咱們能夠經過view改變一個tensor的shape,它會根據咱們指定的shape返回一個新的tensor。機器學習
須要注意的是,view返回的是原數據的一個引用,也就是說咱們改變原數據,view出來的結果會一樣發生變化。編輯器
在上面這個例子當中,咱們把原tensor x中的[0, 1]的位置修改爲了2,咱們print y會發現y當中的元素一樣發生了變化。函數
咱們能夠用numel獲取tenosr當中元素的數量:性能
咱們能夠用squeeze來減小tensor的維度,而使用unsqueeze來增長一個tenor的維度。學習
其中unsqueeze接收一個參數,容許咱們指定咱們但願增長的維度。咱們能夠經過size明顯看到數據的變化:spa
squeeze是減小維度,相比之下沒有那麼多操做,它會自動將長度是1的維度消除,若是沒有一個維度長度是1,也就是說當前已是最簡的形式,那麼什麼也不會變化。
也支持使用另外一個數組做爲索引訪問數據:
Tensor當中支持與Numpy數組相似的索引操做,語法也很是類似。和Numpy同樣,索引獲得的結果是原數據的引用,也就是說咱們修改其中一個,另外一個也會跟着發生變更。
它支持多維索引:
也支持切片:
也能夠經過bool數組獲取元素:
Tensor當中有大量的運算api,咱們只列舉其中最經常使用的幾種,剩下的使用頻率不高,你們能夠用到的時候再去查閱相應的文檔。
Tensor當中支持好幾種運算的方法,咱們以加法爲例來了解一下。首先支持經過符號直接運算:
第二種方法是咱們能夠調用torch當中的函數,好比加法的函數就是add。
若是使用torch當中的函數進行計算的話,它還支持out參數,容許咱們傳入一個tensor,它會將計算結果存儲tensor當中。
除此以外,它還容許咱們進行inplace操做,也就是在原tensor值的基礎上直接修改,而不是經過函數值返回。和Numpy當中傳入inplace參數的設計不一樣,Tensor當中是經過api區分的,在原函數名下增長一個下劃線便是inplace的api,好比add的inplace方法是add_。
在機器學習領域當中,矩陣點乘是一個常常用到的操做。由於爲了節省時間,咱們一般會把樣本和特徵以及各種參數向量化,經過矩陣或者是向量點乘的形式來進行加權求和、線性變換等操做。因此矩陣點乘很是重要,一定會用到。
在Numpy當中咱們經過dot函數來計算兩個矩陣之間的內積,而在Tensor當中作了嚴格的區分,只有一維的向量纔可使用dot計算點乘,多維的向量只能使用matmul計算矩陣的乘法。爲了簡化,還可使用mm來代替matmul。若是你學過TensorFlow的話,你會發現matmul是TensorFlow當中點乘的api,Pytorch當中沿用了這個命名。
能夠看到,mm和matmul計算獲得的結果是一致的。
在Numpy當中,咱們經過astype方法轉換類型,而在Tensor當中將這個方法拆分,每一種類型都有本身的轉化函數。
好比咱們想要將tensor轉化成int類型,調用的是int()方法,想要轉化成float類型調用的是float()方法。調用這些方法以後,會返回一個新的tensor。
Tensor當中定義了7種CPU類型和8種GPU類型:
咱們能夠調用內置函數將它們互相轉化,這些轉換函數有:long(), half(), int(), float(), double(), byte(), char(), short()。我相信這些函數的含義你們應該均可以理解。
Tensor當中的轉置操做和Numpy中不太相同,在Numpy當中,咱們經過.T或者是transpose方法來進行矩陣的轉置。若是是高維數組進行轉置,那麼Numpy會將它的維度徹底翻轉。
而在Tensor當中區分了二維數組和高維數組,二維數組的轉置使用的函數是t(),它的用法和.T同樣,會將二維數組的兩個軸調換。
若是是高維數組調用t函數會報錯,若是咱們要變換高維數組的形狀,能夠調用transpose和permute兩個方法。先說transpose方法,它接收兩個int型參數,表示須要調換的兩個軸。好比一個形狀是[4, 3, 2]的矩陣,咱們能夠經過0,1,2表示它的全部軸,傳入兩個,指定想要調換的兩個軸:
而permute能夠調換多個軸的位置,因此它接受的參數是一個int型的不定參數。咱們傳入咱們但願獲得的軸的順序,Tensor會根據咱們傳入的軸的順序對數據進行翻轉:
另外,t和transpose支持inplace操做,而permute不行,這也是他們顯著的區別之一。
咱們能夠經過device這個屬性看到tensor當前所在的設備:
咱們能夠經過cuda函數將一個在CPU的tensor轉移到GPU,可是不推薦這麼幹。比較好的辦法是使用to方法來進行設備轉移。
將tensor轉移到GPU上進行計算能夠利用GPU的併發性能提高計算的效率,這是Pytorch當中經常使用的手段。to方法不只能夠改變tensor的設備,還能夠同時變動tensor當中元素的類型:
雖然tensor擁有許多額外的功能和計算函數,可是tensor的意義並不只僅如此。最重要的是,它能夠提高咱們的計算速度。這當中的原理也很簡單,由於在Python的List當中,每個元素其實都是一個對象。即便咱們存儲的是一個int或者是float,Python都會將它們封裝成一個對象,這會帶來額外的開銷。若是隻是少許的數據影響不大,若是是上百萬甚至是更大的量級,那麼二者的差距就會很是大。另一點就是tensor庫的底層也是C和C++,運行效率顯然Python更高。因此咱們不能簡單地把它理解成一個計算包,對於深度學習來講,它並不只僅只是計算。
Tensor當中還有許多其餘的方法,這其中許多實用頻率很低加上篇幅的限制,咱們不能一一窮盡,你們只須要對Tensor庫總體有一個映像,一些具體的使用方法和細節能夠用到的時候再進行查詢。
本文基於滴滴雲GPU完成,租借滴滴雲GPU,使用滴滴雲AI大師碼2323,享受9折優惠。
若是喜歡本文,能夠的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。
本文使用 mdnice 排版