PyTorch框架:(1)基本处理操作
目錄
1、PyTorch框架介紹
2、安裝Pytorch
2.1、CPU版本的安裝命令:
2.2、GPU版本的安裝命令:
2.2.1、安裝CUDA
3、基本使用方法
?4、Pytorch中的自動(dòng)求導(dǎo)機(jī)制
4.1、例子:?
??
?4.2、做一個(gè)線性回歸試試水
4.2.1、CPU訓(xùn)練版本
??4.2.1、GPU訓(xùn)練版本
5、常見tensor格式
?6、Pytorch中非常強(qiáng)大的模塊:hub模塊
?6.1、Pytorch hub模塊官網(wǎng):
??6.2、Pytorch hub 的github 站點(diǎn):
?6.3、演示
1、PyTorch框架介紹
? ? ? ? Torch其實(shí)跟Tensorflow中的Tensor是一個(gè)意思,當(dāng)做是能在GPU中計(jì)算的矩陣就可以啦。
意思就是現(xiàn)在我們有了一批數(shù)據(jù),無論你是圖像數(shù)據(jù)還是文本數(shù)據(jù),我們都需要把數(shù)據(jù)轉(zhuǎn)化成一個(gè)矩陣,接下來在建模過程當(dāng)中,我們就是要對這些數(shù)據(jù)做各種各樣的變換,這一些流程做完之后,得到我們想要達(dá)到的結(jié)果。PYtorch其實(shí)做了這樣一些事情,他把我們所有矩陣需要計(jì)算的東西,統(tǒng)統(tǒng)的傳入到GPU當(dāng)中,因?yàn)镚PU當(dāng)中做矩陣運(yùn)算比較快,GPU當(dāng)中幫我們實(shí)現(xiàn)了所有的計(jì)算功能,整體的一個(gè)計(jì)算,從前向傳播到反向傳播,有可能涉及到的非常復(fù)雜的計(jì)算,這些計(jì)算統(tǒng)統(tǒng)框架都幫我們實(shí)現(xiàn)了,我們要去做的就是去設(shè)計(jì)整個(gè)的網(wǎng)絡(luò)流程,整個(gè)的架構(gòu)就可以了,所以說深度學(xué)習(xí)框架說白了就是一個(gè)計(jì)算的工具,幫我們實(shí)現(xiàn)由前到后整體的計(jì)算過程。
2、安裝Pytorch
官網(wǎng):PyTorch
使用pip的安裝方法比較簡單
2.1、CPU版本的安裝命令:
pip3 install torch torchvision torchaudio
2.2、GPU版本的安裝命令:
pip3 install torch==1.9.1+cu102 torchvision==0.10.1+cu102 torchaudio===0.9.1 -f https://download.pytorch.org/whl/torch_stable.html
GPU版本需要選擇你的CUDA版本;(所以先按照下邊的步驟安裝CUDA,注意版本對應(yīng))
?(最好安裝GPU版本,也就是說我們有顯卡,有顯卡我們在訓(xùn)練模型的時(shí)候是非常快速的)
也可以將上述命令復(fù)制到Anaconda Prompt中,執(zhí)行命令,他會(huì)先幫我們下載然后進(jìn)行安裝。
2.2.1、安裝CUDA
CUDA官網(wǎng):
https://developer.nvidia.com/zh-cn
?進(jìn)入安裝頁面:
https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64
?選擇你要安裝的系統(tǒng)是windows還是linux,然后選擇64位的,選擇安裝版本,然后把exe程序給下載下來;下載下來之后.exe程序你自己安裝一下就行了。者那樣就是安裝一個(gè)CUDA,很簡單。
3、基本使用方法
建議先大致熟悉一下基本的操作,不需要花太多時(shí)間,后續(xù)融入到實(shí)戰(zhàn)項(xiàng)目中去邊看邊練。以下所有演示都是在jupyter notebook中。學(xué)框架不要一步步的去看基本操作,直接去看實(shí)際的例子我們一步步怎么去走就可以了,邊看邊查。
(1)創(chuàng)造一個(gè)矩陣
它的格式是一個(gè)tensor,是一個(gè)張量,把他當(dāng)做是一個(gè)矩陣就行了,這個(gè)矩陣?yán)镞厧拙S的都行,一維的是一個(gè)向量,二維的是一個(gè)矩陣,還有多維的,不管他是一個(gè)幾維的我統(tǒng)一把他叫做一個(gè)tensor,他在我們深度學(xué)習(xí)當(dāng)中是一個(gè)最基本的單元,是框架的底層了。你要用PyTorch框架,需要把數(shù)據(jù)都轉(zhuǎn)化成tensor的格式,tensor的格式才是他底層所支持的一個(gè)格式。框架當(dāng)中基本的要求所有的格式所有的計(jì)算都是對tensor所執(zhí)行的,所以說每一次當(dāng)我調(diào)torch API當(dāng)中,得到的結(jié)果都是tensor格式。
?(2)創(chuàng)造一個(gè)矩陣(隨機(jī)的5行3列)
??(2)創(chuàng)造一個(gè)矩陣(全0的矩陣)
跟Numpy當(dāng)中很相似,只不過在Numpy當(dāng)中得到的是ndarray,在這里得到的是tensor格式。
?(3)直接傳入數(shù)據(jù)
?(4)構(gòu)建一個(gè)同樣大小的矩陣
?(5)展示矩陣大小(表示當(dāng)前的矩陣是幾行幾列的,維度全部計(jì)算出來了,類似于.shape)
?(6)矩陣加法
(7)索引(跟python和numpy當(dāng)中都是一模一樣的,冒號(hào):表示取所有)
?(8)改變矩陣維度view操作(類似于.reshape操作)
?將4x4的矩陣?yán)梢粋€(gè)向量,拉成一行;view就是把他reshape成一個(gè)新的維度。-1表示自動(dòng)去做計(jì)算,第二個(gè)維度有8個(gè)元素,那么第一個(gè)維度就是自動(dòng)計(jì)算16/8=2。
(9)與Numpy的協(xié)同操作(互相轉(zhuǎn)換)
我們通常讀進(jìn)來的數(shù)據(jù),不論你使用的是opencv還是其他的工具包,第一步都是說把數(shù)據(jù)讀進(jìn)來,讀進(jìn)來的數(shù)據(jù)一般都是ndarray的格式,該格式不能和tensor的格式交互計(jì)算,所以需要把tensor格式轉(zhuǎn)化成Numpy中的ndarray格式,可以進(jìn)行直接轉(zhuǎn)換。
(9.1)把tensor格式直接轉(zhuǎn)化成numpy中的ndarray格式。
?(9.2)把numpy中的ndarray格式轉(zhuǎn)換成tensor格式。
?4、Pytorch中的自動(dòng)求導(dǎo)機(jī)制
在神經(jīng)網(wǎng)絡(luò)的反向傳播中,我們要對每一個(gè)參數(shù)進(jìn)行求導(dǎo),逐層的進(jìn)行求導(dǎo),并且這個(gè)w他不是一個(gè)數(shù),他是一個(gè)矩陣,對這些矩陣進(jìn)行求導(dǎo)時(shí),難度就比較大,我們用深度學(xué)習(xí)框架最核心的一點(diǎn)是能幫我們把反向傳播全部計(jì)算好。我們把時(shí)間花在怎么樣去設(shè)計(jì)網(wǎng)絡(luò),怎么樣去構(gòu)建網(wǎng)絡(luò)模型。
4.1、例子:?
?
?上述例子自動(dòng)求導(dǎo)代碼;
?PyTorch他跟其他框架是不一樣的,在做反向傳播的時(shí)候,如果你不對這個(gè)梯度進(jìn)行一個(gè)清0的操作,他每一次會(huì)把之前的累加在一起,注意他是做了一個(gè)累加的操作。如果你不清0,他默認(rèn)梯度是累加的;
Q1:在實(shí)際的訓(xùn)練模型的過程當(dāng)中,我每次計(jì)算一個(gè)梯度,我需要對它做一個(gè)累加嗎?
A1:一般情況下不需要做一個(gè)累加。
如何把梯度先做一個(gè)清0,再進(jìn)行計(jì)算,再更新參數(shù),是有一個(gè)步驟的?
?4.2、做一個(gè)線性回歸試試水
4.2.1、CPU訓(xùn)練版本
?第一步:準(zhǔn)備數(shù)據(jù)x和y
第二步:構(gòu)建模型?
?第三步:指定參數(shù)和損失函數(shù)
第四步:開始訓(xùn)練模型
?第五步:模型測試預(yù)測結(jié)果
?第六步:模型的保存與讀取
下面是CPU訓(xùn)練版本的代碼段:
import torch
import torch.nn as nn#nn模塊就是torch.nn模塊下有很多豐富的功能我們都可以去用#準(zhǔn)備(數(shù)據(jù))
#構(gòu)造一組輸入數(shù)據(jù)X和其對應(yīng)的標(biāo)簽y
import numpy as np
x_values=[i for i in range(11)]
x_train=np.array(x_values,dtype=np.float32)#x是ndarray的格式
x_train=x_train.reshape(-1,1)#把數(shù)據(jù)轉(zhuǎn)化成矩陣的格式
x_train.shapey_values=[2*i + 1 for i in x_values]#y=2x+1
y_train=np.array(y_values,dtype=np.float32)
y_train=y_train.reshape(-1,1)
y_train.shape#準(zhǔn)備模型
"""
有了x和y之后,構(gòu)建線性回歸模型,讓模型學(xué)習(xí)一下這個(gè)w和b分別是多少就可以了。
無論構(gòu)造一個(gè)多么復(fù)雜的類型,我都先把這個(gè)類構(gòu)造出來(然后繼承一下nn模塊),nn模塊下有一個(gè)Module模塊
(Module模塊的意思就是里邊很多的東西都給我們實(shí)現(xiàn)好了,咱直接繼承這個(gè)里邊的,
相當(dāng)于下邊我只需要去寫我這個(gè)線性回歸模型用哪個(gè)層就得了,其他的事統(tǒng)統(tǒng)給他省略掉(人家都已經(jīng)做好了我直接繼承過來就得了))
"""
class LinearRegressionModel(nn.Module):def __init__(self,input_dim,output_dim):super(LinearRegressionModel,self).__init__()#由于類的繼承導(dǎo)致可能覆蓋同名的構(gòu)造方法,導(dǎo)致只能使用子類的構(gòu)造,#而無法調(diào)用父類的構(gòu)造方法。但其實(shí)可以使用super方法解決這個(gè)問題。 self.linear=nn.Linear(input_dim,output_dim)#這里直接使用全連接層(指定參數(shù)表示輸入數(shù)據(jù)的維度、輸出數(shù)據(jù)的維度)'''在構(gòu)造函數(shù)里邊只需要去寫你用到了哪些層,(線性回歸無非就是你給我x和y,我訓(xùn)練出w和b,使得wx+b跟y的值越接近越好,這不就是一個(gè)全連接層嘛,nn模塊中有很多個(gè)層,我們可以直接來做調(diào)用)'''#寫一個(gè)前向傳播函數(shù)def forward(self,x):out=self.linear(x)#在線性回歸中,走法直接,直接走一個(gè)全連接層,把x輸入進(jìn)去,得到輸出結(jié)果就完事了,對于線性回歸就是wx+breturn out#在自己定義的這個(gè)類當(dāng)中, 我們自己去寫一個(gè)模型,最基本的情況下我們寫兩個(gè)就足夠了,
#第一個(gè):就是構(gòu)造函數(shù)當(dāng)中,我們?nèi)懩阌玫搅四膫€(gè)層(比如有全連接層、池化層、卷積層等),你用到哪個(gè)層了你就在
#構(gòu)造函數(shù)當(dāng)中全指定出來.
#第二個(gè):然后接下來我寫一個(gè)前向傳播,前向傳播的意思就是我們不是用到了這么多個(gè)層嘛,那這些層你是怎么去用的,
#需要把這些數(shù)據(jù)由輸入開始經(jīng)過了哪些層,有輸出結(jié)果,這條線穿起來,#構(gòu)建model
input_dim=1
output_dim=1#輸入輸出維度分別都是1
model=LinearRegressionModel(input_dim,output_dim)
model#打印model(按照網(wǎng)絡(luò)從前到后怎么走的,把你剛才設(shè)計(jì)的流程打印出來)這個(gè)當(dāng)中就是一個(gè)全連接層#訓(xùn)練
"""
1、指定訓(xùn)練的次數(shù);這里按照batch去做,一個(gè)batch就是全部數(shù)據(jù),所以說一共迭代1000次(1000個(gè)epochs)
2、學(xué)習(xí)率;
3、指定優(yōu)化器;這里使用SGD,在SGD中要告訴我優(yōu)化什么東西,把模型當(dāng)中涉及到的模型參數(shù)全部加進(jìn)去,
一會(huì)去優(yōu)化這些參數(shù)就可以了,再告訴我當(dāng)前的學(xué)習(xí)率是多少。
4、定一個(gè)損失函數(shù);損失函數(shù)是看任務(wù)去說的,一般分類任務(wù)就是交叉熵,回歸任務(wù)常規(guī)條件下就是MSE損失函數(shù)
(算一下預(yù)測值和真實(shí)值之間的均方誤差就完事了)"""
epochs=1000
learning_rate=0.01
optimizer=torch.optim.SGD(model.parameters(),lr=learning_rate)
criterion=nn.MSELoss()#訓(xùn)練
for epoch in range(epochs):#迭代1000次epoch+=1#注意轉(zhuǎn)換成tensorinputs=torch.from_numpy(x_train)#開始定義的x和y是ndarray格式,不能直接進(jìn)行訓(xùn)練labels=torch.from_numpy(y_train)#梯度要清零每一次迭代(清零相當(dāng)于在上一次的結(jié)果在這一次我都不需要去做了)optimizer.zero_grad()#不清零的話每一次進(jìn)行反向傳播梯度都累加了#前向傳播outputs=model(inputs)#剛才構(gòu)建了一個(gè)model,model里邊有一個(gè)前向傳播,model里邊我把實(shí)際的x傳進(jìn)去,他就是前向傳播的結(jié)果#計(jì)算損失loss=criterion(outputs,labels)#現(xiàn)在手里有一個(gè)輸出結(jié)果,還有一個(gè)標(biāo)簽,就可以計(jì)算損失函數(shù)#反向傳播loss.backward()#計(jì)算完損失值再做一個(gè)反向傳播#(注意:做完反向傳播之后,相當(dāng)于他是把你的梯度給你求出來了,但是沒有給你進(jìn)行更新,#各個(gè)需要求梯度的參數(shù)全部給你求出來了,但是此時(shí)沒有做更新,更新操作需要自己來指定)#更新權(quán)重參數(shù)optimizer.step()#這個(gè)就是進(jìn)行一次參數(shù)的更新,參數(shù)更新的時(shí)候他會(huì)基于你的學(xué)習(xí)率以及計(jì)算出來#的梯度值自動(dòng)的幫你完成這樣反向傳播的一個(gè)流程if epoch % 50 == 0:print('epoch{},loss{}'.format(epoch,loss.item()))predicted=model(torch.from_numpy(x_train).requires_grad_()).data.numpy()#模型測試很簡單有理數(shù)據(jù)之后,前向傳播走一次就完事了
predicted#.data.numpy()表示把這個(gè)結(jié)果轉(zhuǎn)化成numpy的格式,打印的就是ndarray的格式(因?yàn)楹罄m(xù)畫圖有的地方需要傳輸ndarray的格式)#保存模型
torch.save(model.state_dict(),'model.pkl')#保存模型實(shí)際上保存的是字典的文件,model.state_dict()就是模型的權(quán)重參數(shù),
#把w和b保存下來,叫做model.pkl
#后邊還可以動(dòng)態(tài)的保存模型,邊訓(xùn)練邊測試,保存那些好的模型,不好的就不要model.load_state_dict(torch.load('model.pkl'))#讀取一下當(dāng)前模型的權(quán)重參數(shù),把當(dāng)前的pkl讀進(jìn)來就行了
??4.2.1、GPU訓(xùn)練版本
PS:使用GPU進(jìn)行訓(xùn)練,只需要把數(shù)據(jù)和模型傳入到cuda里面就可以了。
我們之前的數(shù)據(jù)和模型都是傳到CPU中去跑的,但是使用GPU進(jìn)行訓(xùn)練我們要傳到GPU去跑了,傳入到cuda中去跑了。
下面是GPU訓(xùn)練版本的代碼 :
import torch
import torch.nn as nn
import numpy as npclass LinearRegressionModel(nn.Module):def __init__(self,imput_dim,output_dim):super(LinearRegressionModel,self).__init__()self.linear=nn.Linear(input_dim,output_dim)def forward(self,x):out=self.linear(x)return outinput_dim=1
output_dim=1model=LinearRegressionModel(input_dim,output_dim)device=torch.device("cuda:0"if torch.cuda.is_available() else "cpu")
#這里指定設(shè)備是cuda,做個(gè)判斷當(dāng)前cuda是否配置好了,如果說配置好了用cuda去跑,如果說沒配置好咱用cpu去跑
#---------------第一個(gè):把模型構(gòu)建好傳入到cuda當(dāng)中
model.to(device)#把模型.to放到哪,如果配置好了GPU那就是放到了GPU,如果沒有配置好那就是CPU。criterion=nn.MSELoss()learning_rate=0.01
optimizer=torch.optim.SGD(model.parameters(),lr=learning_rate)epochs=1000
for epoch in range(epochs):#迭代1000次epoch+=1#-------------第二個(gè):輸入.to全部的傳入到GPU當(dāng)中inputs=torch.from_numpy(x_train).to(device)labels=torch.from_numpy(y_train).to(device)optimizer.zero_grad()outputs=model(inputs)loss=criterion(outputs,labels)loss.backward()optimizer.step()if epoch % 50 == 0:print('epoch{},loss{}'.format(epoch,loss.item()))
5、常見tensor格式
?我們現(xiàn)在拿到的一切數(shù)據(jù)放到pytorch當(dāng)中都轉(zhuǎn)成一個(gè)tensor的格式,這些tensor的格式不是都一樣的,還是有一定的區(qū)別:
(1)0:scalar(一個(gè)數(shù)值)
(2)1:vector(一個(gè)向量,一維)
(3)2:matrix(一個(gè)矩陣,二維)
(4)3:n-dimensional tensor(高維數(shù)據(jù))
?
?具體實(shí)現(xiàn):
?
?6、Pytorch中非常強(qiáng)大的模塊:hub模塊
?Q1:hub模塊做一些什么事?
A1:我們在看一些論文,或者資料的時(shí)候會(huì)經(jīng)常聽說一些詞叫做model?zoo,意思就是我們現(xiàn)在學(xué)術(shù)界有很多優(yōu)秀的論文,這些優(yōu)秀的論文在做各種各樣的事,有做分割,有做檢測的等等,model?zoo就是說我把人家做的比較好的論文當(dāng)中的網(wǎng)絡(luò)模型可以拿過來,以及把他們預(yù)訓(xùn)練好的模型也拿過來,方便我們自己調(diào)用,說白了就是說調(diào)用人家訓(xùn)練好的網(wǎng)絡(luò)架構(gòu)以及訓(xùn)練好的權(quán)重參數(shù),使得我們這個(gè)任務(wù)一行代碼就可以解決掉(一行代碼就可以把你想用的模型加載進(jìn)來),這個(gè)就是model?zoo或者h(yuǎn)ub模塊所做的事情,方便大家進(jìn)行調(diào)用。
這就是pytorch當(dāng)中類似model zoo的hub模塊。
?6.1、Pytorch hub模塊官網(wǎng):
PyTorch Hub | PyTorch
6.2、使用演示
以第一個(gè)為例(3D ResNet)演示一下怎么使用:?
第一步:點(diǎn)擊第一個(gè)如下
?第二步:點(diǎn)擊Open on Google Colab
一個(gè)是在github上我們可以打開看一下他的介紹;一個(gè)是在Google當(dāng)中他給你提供了一個(gè)實(shí)驗(yàn)環(huán)境,比如說點(diǎn)開一下Google那個(gè),會(huì)到如下界面:
?就是Google給你提供好了實(shí)驗(yàn)環(huán)境,相當(dāng)于云端的實(shí)驗(yàn)環(huán)境;在這個(gè)實(shí)驗(yàn)環(huán)境當(dāng)中你直接使用人家的GPU去跑就可以了。
第三步:運(yùn)行單元格(首次運(yùn)行需要配置)
?配置GPU保存一下:
?第四步:依次執(zhí)行單元格
?-----------------總之,就是給我們提供了一個(gè)刻意練習(xí)的環(huán)境-------------------
??6.2、Pytorch hub 的github 站點(diǎn):
GitHub - pytorch/hub: Submission to https://pytorch.org/hub/
?6.3、演示
(下邊這些代碼,都是可以直接從github那個(gè)鏈接你選擇的模型進(jìn)行代碼復(fù)制的)
第一步:下載人家的架構(gòu)和模型,會(huì)把deeplabv3_resnet101這個(gè)網(wǎng)絡(luò)架構(gòu)下載下來,以及模型文件。
?第二步:打包為list看一下有哪些可以使用(pytorch當(dāng)中你選擇當(dāng)前的一個(gè)版本)
因?yàn)閔ub模塊也是不停在升級(jí)的,版本升高之后,List里邊打印的結(jié)果就是不同的。
?第三步:下載一張實(shí)際的輸入數(shù)據(jù)
第四步:調(diào)用模型
?把數(shù)據(jù)進(jìn)行基本的預(yù)處理,然后輸入到網(wǎng)絡(luò)當(dāng)中,就可以得到最后的結(jié)果。
?PS:因?yàn)閯e人已經(jīng)把所有的工作都做完了,所以我們做起來就簡單多了。
總結(jié)
以上是生活随笔為你收集整理的PyTorch框架:(1)基本处理操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卷积神经网络基础:(8)递归神经网络RN
- 下一篇: PyTorch框架:(2)使用PyTor