算法小白的pytorch筆記--chapter1 Tensor張量


這章說的是基礎(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的話,也可以在kagglecolaboratory上學(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ù)組
\begin{align} \\& scalar: 1 \\& vector = \begin{bmatrix}1,0,0,0,0 \end{bmatrix} \\& matrix = \begin{bmatrix} 1,0,0,0,0\\0,1,0,0,0\\0,0,1,0,0\\0,0,0,1,0\\0,0,0,0,1 \end{bmatrix} \end{align}

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官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容