
這章說的是基礎(chǔ)概念Tensor,但是在說之前想簡(jiǎn)單扯一扯pytorch的安裝和大廠提供給我們的GPU白嫖資源~
1.1 Install pytorch
pytorch的安裝其實(shí)很簡(jiǎn)單,只要上pytorch的官網(wǎng),選好對(duì)應(yīng)的配置后復(fù)制給出的command,然后在終端Terminal運(yùn)行即可
【快速鏈接??】pytorch官方下載

由于pytorch的安裝太簡(jiǎn)單,這里就不多贅述了,如果不想在自己電腦上跑pytorch的話,也可以在kaggle和colaboratory上學(xué)習(xí),相關(guān)環(huán)境也已經(jīng)幫我們配置好了~【提一句,最好科學(xué)上網(wǎng)一下】
附上對(duì)應(yīng)鏈接,注冊(cè)賬號(hào)后就可以免費(fèi)用在線的notebook和GPU了
在pytorch中,我們操作的基本數(shù)據(jù)類型叫張量(Tensor),那這個(gè)Tensor到底是個(gè)啥東西呢,我個(gè)人理解其實(shí)可以簡(jiǎn)單理解為數(shù)組,熟悉Numpy或者線性代數(shù)的小伙伴應(yīng)該都不會(huì)陌生,零維數(shù)組就是一個(gè)標(biāo)量,一維數(shù)組代表向量,二維數(shù)組代表矩陣,n維數(shù)組代表高維度數(shù)組
那有小伙伴問了,那我為啥不直接用Numpy的array要用tensor呢?這是因?yàn)樯疃葘W(xué)習(xí)框架很多時(shí)候是需要用到GPU來進(jìn)行運(yùn)算的,同樣是一個(gè)相同的矩陣,如果不是tensor類型的話,是不能被放到GPU中運(yùn)算的,這也是為什么在pytorch中我們都會(huì)使用張量來運(yùn)算而不是數(shù)組
1.2 創(chuàng)建張量
1.2.1 通過3種數(shù)據(jù)結(jié)構(gòu)創(chuàng)建
學(xué)習(xí)首先要從最基礎(chǔ)的開始,對(duì)pytorch來說,最基礎(chǔ)的就是張量的創(chuàng)建了
在pytorch下,有三種方法可以創(chuàng)建張量,一是通過列表(list),二是通過元組(tuple),三是通過Numpy的數(shù)組(array),基本創(chuàng)建代碼如下:
import torch # 導(dǎo)入pytorch
import numpy as np # 導(dǎo)入numpy
print(torch.__version__) # 查看torch版本
t1 = torch.tensor([1,1]) # 通過列表創(chuàng)建
t1 = torch.tensor((1,1)) # 通過元組創(chuàng)建
t1 = torch.tensor(np.array([1,1]) # 通過數(shù)組創(chuàng)建
t1 # tensor([1, 1])
創(chuàng)建完張量后,我們還需要記住一些查看張量相關(guān)屬性的基本操作,因?yàn)楹笃谟龅降膹埩拷Y(jié)構(gòu)都比較復(fù)雜,難以用肉眼直接看出,因此相關(guān)方法用的也比較頻繁
| 方法 | 描述 | 栗子?? |
|---|---|---|
ndim |
查看張量的維度,也可使用dim() |
t.ndim /t.dim()
|
dtype |
查看張量的數(shù)據(jù)結(jié)構(gòu) | t.dtype |
shape |
查看張量的形狀 | t.shape |
size |
查看張量的形狀,和shape方法相同 | t.size() |
numel |
查看張量?jī)?nèi)元素的元素 | t.numel() |
稍微注意一下,size()和numel()是需要加括號(hào)滴【代表函數(shù)的調(diào)用】,下面是具體案例用法
t2 = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
t2.ndim # 2
t2.dtype # torch.int64
t2.shape # torch.Size([3, 3])
t2.size() # torch.Size([3, 3])
t2.numel() # 返回9
python作為動(dòng)態(tài)語(yǔ)言,平常我們基本不會(huì)去注意到變量的類型,因?yàn)槲覀兙帉懘a時(shí)并不需要聲明變量類型,但是細(xì)心的小伙伴會(huì)發(fā)現(xiàn),調(diào)用dtype后返回的是torch.int64, 這說明pytorch對(duì)于數(shù)組的類型是很嚴(yán)謹(jǐn),因此我們還要了解在pytorch下的數(shù)組類型
懶的小伙伴其實(shí)只需要記住有整數(shù),浮點(diǎn)數(shù),布爾型和復(fù)數(shù)即可,但為了文章的完整,我肯定還是要說一說
| 類型 | dtype |
|---|---|
| 32bit浮點(diǎn)數(shù) | 【單精度】torch.float32 / torch.float |
| 64bit浮點(diǎn)數(shù) | 【雙精度】torch.float64或torch.double |
| 16bit浮點(diǎn)數(shù) | torch.float16 |
| 8bit無符號(hào)整數(shù) byte | torch.unit8 |
| 8bit有符號(hào)整數(shù) | torch.int8 |
| 16bit有符號(hào)整數(shù) | torch.int16 / torch.short |
| 32bit有符號(hào)整數(shù) | torch.int32 / torch.int |
| 64bit有符號(hào)整數(shù) | torch.int64 / torch.long |
| 布爾型 | torch.bool |
| 復(fù)數(shù)型 | torch.complex64 |
在pytorch中,默認(rèn)的張量整數(shù)類型是int64,使用浮點(diǎn)數(shù)類型是float32【根據(jù)pytorch版本的不同可能會(huì)有所不同】;
雙精度double能存儲(chǔ)的有效位數(shù)比單精度f(wàn)loat更多,但相應(yīng)的需要的存儲(chǔ)空間越多
int16,int32,int64的區(qū)別主要在于表示值的范圍不同,數(shù)字越大所能表示的范圍越大
在pytorch中,可以使用在創(chuàng)建時(shí)指定數(shù)據(jù)類型,也可以后期進(jìn)行修改,下面是案例
t3 = torch.tensor([True, 1.0]) # tensor([1., 1.])隱式轉(zhuǎn)換
t3 = torch.tensor([1,1,1,1],dtype=float)
t3.dtype # torch.float64
t3.int() # tensor([1, 1, 1, 1], dtype=torch.int32)
t3.byte() # tensor([1., 1., 1., 1.], dtype=torch.float64)
t3.short() # tensor([1, 1, 1, 1], dtype=torch.int16)
t3.bool() # tensor([True, True, True, True])
1.2.2 通過相關(guān)方法創(chuàng)建特殊張量
除了使用列表,元組和數(shù)組創(chuàng)建張量外,還可以使用相關(guān)方法來創(chuàng)建張量
| 方法 | 描述 |
|---|---|
torch.zeros() |
創(chuàng)建全為0的張量 |
torch.ones() |
創(chuàng)建全為1的張量 |
torch.eye() |
創(chuàng)建對(duì)角為1的單位矩陣 |
torch.diag(t) |
創(chuàng)建對(duì)角矩陣,需要傳入1維張量 |
torch.rand() |
創(chuàng)建服從0-1均勻分布的張量 |
torch.randn() |
創(chuàng)建服從標(biāo)準(zhǔn)正態(tài)分布的張量 |
torch.normal() |
創(chuàng)建服從制定正態(tài)分布的張量 |
torch.randn |
創(chuàng)建服從標(biāo)準(zhǔn)正態(tài)分布的張量 |
torch.randint() |
創(chuàng)建由指定范圍隨機(jī)抽樣整數(shù)組成的張量 |
torch.arange() |
創(chuàng)建給定范圍內(nèi)的連續(xù)整數(shù)組成的張量 |
torch.linspace() |
創(chuàng)建給定范圍內(nèi)等距抽取的數(shù)組成的張量 |
torch.empty() |
創(chuàng)建未初始化的指定形狀的張量 |
torch.full() |
創(chuàng)建指定形狀,指定填充數(shù)值的張量 |
以下是案例,需要注意有哪些方法是傳入代表結(jié)構(gòu)的列表,有哪些是傳入張量,有哪些是傳入數(shù)字
torch.zeros([3,3]) # 創(chuàng)建3行3列,元素全為0的2維張量
torch.ones([3,3]) # 創(chuàng)建3行3列,元素全為1的2維張量
torch.eye(4) # 創(chuàng)建4行4列的單位矩陣
t = torch.tensor([1,2,3,4]) # 創(chuàng)建需要傳入的1維張量
torch.diag(t) # 創(chuàng)建對(duì)角元素為1,2,3,4的對(duì)角矩陣
torch.rand([3,4]) # 創(chuàng)建元素為0-1分布的3行4列張量
torch.normal(3, 4, [2, 2]) # 創(chuàng)建服從均值為3,標(biāo)準(zhǔn)差為4的正態(tài)分布元素組成的張量
torch.randn([3,4]) # 創(chuàng)建元素為標(biāo)準(zhǔn)正態(tài)分布的3行4列張量
torch.randint(0,20,[3,4]) # 創(chuàng)建由0-20間的隨機(jī)整數(shù)組成的3行4列的張量
torch.arange(1,20) # 創(chuàng)建0-20內(nèi)連續(xù)整數(shù)組成的張量
torch.linspace(1, 10, 5) # 創(chuàng)建給定范圍內(nèi)等距取樣的數(shù)組成的張量
torch.empty([3,4]) # 創(chuàng)建3行4列的未初始化張量
torch.full([3, 4], 2) # 創(chuàng)建3行4列的全為2的張量
上述是一些用的較多的特殊常見方法,也不需要全記住,需要用到的時(shí)候查閱即可
1.2 張量的維度&形狀
張量的維度是怎么看的呢?代表什么意思呢?比如,為什么torch.tensor([[1, 2], [3, 4]]).ndim為什么返回的是2呢?這個(gè)2代表什么意思呢?別急,現(xiàn)在就給大家說說
ndim返回的是對(duì)應(yīng)張量對(duì)象的維度,范圍2就說明這個(gè)張量是2維的,3就說明這個(gè)張量是3維的,返回幾就說明這個(gè)向量的幾維的
那么怎么理解這個(gè)結(jié)構(gòu)呢?
我們先從0維講起,0維說明這個(gè)張量是一個(gè)0維張量,對(duì)應(yīng)的其實(shí)是一個(gè)標(biāo)量,也就是一個(gè)數(shù),但要注意這個(gè)標(biāo)量和普通的標(biāo)量又有所區(qū)別,這是一個(gè)可以在GPU下運(yùn)行的標(biāo)量
如果ndim返回的是1,對(duì)應(yīng)的是1維張量,說明這個(gè)張量是一個(gè)向量vector
如果ndim返回的是2,對(duì)應(yīng)的是2維張量,是有n行m列的矩陣matrix
如果ndim返回的是3,對(duì)應(yīng)的是有a個(gè)n行m列的矩陣,比如下面的矩陣就代表2個(gè)2行2列的矩陣
torch.tensor([[[1,1],[1,1]],[[1,1],[1,1]]])
'''
tensor([[[1, 1],
[1, 1]],
[[1, 1],
[1, 1]]])
'''
如果ndim返回的是4呢,對(duì)應(yīng)的就是a組,每組里有b個(gè)n行m列的矩陣
以此類推....
我們?cè)趧?chuàng)建張量時(shí)可以指定其結(jié)構(gòu)和維度,在創(chuàng)建后也可以對(duì)其進(jìn)行修改,我們可以使用reshape()方法修改其結(jié)構(gòu)和維度,參數(shù)傳入維度組成的列表,需要注意修改結(jié)構(gòu)前后元素的數(shù)量要相等
如果高緯張量要變成一維張量,可以使用flatten()方法,也可以使用reshape(t.numel())
torch.normal(3, 4, size=[2, 2]) # 創(chuàng)建時(shí)指定形狀
t4 = torch.tensor([1,2,3,4,5,6,7,8])
t4 = t4.reshape([2,4]) # 改成2行4列的張量
t4
'''
tensor([[1, 2, 3, 4],
[5, 6, 7, 8]])
'''
t4.reshape(t4.numel()) # tensor([1, 2, 3, 4, 5, 6, 7, 8])
t4.flatten() # tensor([1, 2, 3, 4, 5, 6, 7, 8])
以上是chapter1 1.1到1.2部分的內(nèi)容,歡迎小伙伴們一起交流討論~
參考資料
[1] pytorch官方文檔