版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第12章
深度學(xué)習(xí)1學(xué)習(xí)目標(biāo)理解深度學(xué)習(xí)的基本原理。掌握PyTorch深度學(xué)習(xí)框架的基本操作。掌握常用深度學(xué)習(xí)模型的構(gòu)建方法。1223目錄頁312.1基本原理12.2應(yīng)用實(shí)例深度學(xué)習(xí)深度學(xué)習(xí)(DeepLearning)通過模擬人腦認(rèn)識與分析問題的機(jī)理以對數(shù)據(jù)(例如圖像、聲音和文本)進(jìn)行表征學(xué)習(xí);相對于淺層人工神經(jīng)網(wǎng)絡(luò),深度學(xué)習(xí)通過增加隱層數(shù)量與優(yōu)化訓(xùn)練方法等方式提高其對數(shù)據(jù)內(nèi)在規(guī)律的表達(dá)能力,因而可以有效地從數(shù)據(jù)中提取不同抽象層次的全局或局部特征以用于提高樣本分類的精度與可靠性。4在人工神經(jīng)網(wǎng)絡(luò)的研究中,隱層結(jié)構(gòu)(層次數(shù)量與每層神經(jīng)元數(shù)量)是構(gòu)建可靠的人工神經(jīng)網(wǎng)絡(luò)的關(guān)鍵;從理論上而言,復(fù)雜的隱層結(jié)構(gòu)表達(dá)能力強(qiáng),但同時(shí)也易出現(xiàn)過擬合、難訓(xùn)練等問題。(1)2006年,杰弗里·辛頓(GeoffreyHinton)《深度信念網(wǎng)的快速學(xué)習(xí)算法》中對人工神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的梯度彌散(誤差反饋至前層時(shí)將變小)問題產(chǎn)生的根源進(jìn)行了分析并初步提出了深度學(xué)習(xí)概念與相關(guān)框架,在學(xué)術(shù)圈引起了巨大的反響。(2)2012年,辛頓領(lǐng)導(dǎo)的團(tuán)隊(duì)利用深度學(xué)習(xí)模型AlexNet在ImageNet圖像識別競賽奪冠之后,深度學(xué)習(xí)備受研究者的關(guān)注并在圖像理解、自然語言處理等諸多研究與應(yīng)用領(lǐng)域迅猛發(fā)展,已逐步演化為人工神經(jīng)網(wǎng)絡(luò)乃至機(jī)器學(xué)習(xí)中極為重要的分支。512.1基本原理1981年,諾貝爾醫(yī)學(xué)獎(jiǎng)獲得者DavidHubel和TorstenWiesel人類視覺系統(tǒng)的信息處理機(jī)制進(jìn)行深入地研究,發(fā)現(xiàn)了一種被稱為“方向選擇性細(xì)胞”的神經(jīng)元細(xì)胞;此類神經(jīng)元細(xì)胞當(dāng)瞳孔發(fā)現(xiàn)了物體的邊緣指向某個(gè)方向時(shí)異常活躍。在此基礎(chǔ)上,人們進(jìn)一步發(fā)現(xiàn)人類的視覺系統(tǒng)的信息處理是分級的,其主要表現(xiàn)在:6(1)人腦視覺機(jī)理12.1.1基本概念高層的特征是低層特征的組合,從低層到高層的特征表示越來越抽象,越來越能表現(xiàn)語義或者意圖。抽象層面越高,存在的可能猜測就越少,就越利于分類。7(1)人腦視覺機(jī)理12.1.1基本概念從數(shù)據(jù)中自動(dòng)提取不同層次的局部或全部特征是深度學(xué)習(xí)的根本目的。根據(jù)辛頓針對深度學(xué)習(xí)的描述,其主要觀點(diǎn)如下。(1)多隱層的人工神經(jīng)網(wǎng)絡(luò)具有優(yōu)異的特征學(xué)習(xí)能力,學(xué)習(xí)得到的特征對數(shù)據(jù)有更本質(zhì)的刻畫,從而更有利于可視化或分類;(2)深度神經(jīng)網(wǎng)絡(luò)在訓(xùn)練上的難度,可以通過無監(jiān)督式的“逐層初始化”進(jìn)行克服。本質(zhì)上,深度學(xué)習(xí)以增加人工神經(jīng)網(wǎng)絡(luò)隱層數(shù)或深度為手段并通過特定的訓(xùn)練方式提高相關(guān)權(quán)重或參數(shù)求取的可靠性,進(jìn)而實(shí)現(xiàn)層次化特征學(xué)習(xí)的目的。8(2)深度學(xué)習(xí)的提出12.1.1基本概念(1)強(qiáng)調(diào)模型結(jié)構(gòu)深度:通常有幾十層或更多層。(2)明確突出了特征學(xué)習(xí)的重要性:通過逐層特征變換,將樣本在原空間的特征表示變換到一個(gè)新特征空間,從而使分類或預(yù)測更加容易。與人工規(guī)則構(gòu)造特征的方法相比,利用大數(shù)據(jù)來學(xué)習(xí)特征,更能夠刻畫數(shù)據(jù)的豐富內(nèi)在信息。(3)深度學(xué)習(xí)實(shí)現(xiàn)任意復(fù)雜函數(shù)的逼近。(4)深度學(xué)習(xí)采用逐層訓(xùn)練機(jī)制。9(3)深度學(xué)習(xí)與淺層學(xué)習(xí)的區(qū)別12.1.1基本概念102017年1月,F(xiàn)acebook人工智能研究院(FAIR)基于Torch(由豐富機(jī)器學(xué)習(xí)算法支持的科學(xué)計(jì)算框架)推出了PyTorch深度神經(jīng)網(wǎng)絡(luò)框架,經(jīng)過幾年的發(fā)展,逐步成為人工智能領(lǐng)域相關(guān)方向科研與應(yīng)用開發(fā)的利器。12.1.2PyTorch框架
12.1.2PyTorch框架11PyTorch框架的主要特點(diǎn)如下。(1)通過張量、變量與層/模塊等三級抽象層次實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的構(gòu)建,思路明晰、結(jié)構(gòu)簡潔;同時(shí)具有簡單易用的API接口以方便不同層次相關(guān)結(jié)構(gòu)的修改與操作,所需代碼量少且易于理解。API接口使用方法與科學(xué)計(jì)算庫Numpy非常類似,而且與Numpy之間可進(jìn)行轉(zhuǎn)換。(2)與Tensorflow的靜態(tài)計(jì)算圖不同,PyTorch的計(jì)算圖是動(dòng)態(tài)的(即可以根據(jù)計(jì)算需要實(shí)時(shí)改變計(jì)算圖)。(3)利用GPU運(yùn)算加速以提高深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練與測試的效率。
Anaconda安裝首先進(jìn)入PyTorch官網(wǎng)(網(wǎng)址:/)獲取安裝命令,然后在conda命令環(huán)境下執(zhí)行。以Windows10操作系統(tǒng)、Python3.7為例,由于本機(jī)未安裝CUDA,因而選擇CUDA項(xiàng)的None配置。1212.1.2PyTorch框架
PyTorch框架基本操作PyTorch框架利用張量(Tensor)實(shí)現(xiàn)數(shù)據(jù)的加速運(yùn)算,從而解決深度神經(jīng)網(wǎng)絡(luò)運(yùn)算量巨大而Numpy庫無法利用GPU進(jìn)行數(shù)據(jù)加速運(yùn)算的問題。導(dǎo)入PyTorch庫:importtorch1.張量(Tensor)Pytorch框架最基本的操作對象為張量(Tensor),其在結(jié)構(gòu)上與Numpy庫中的多維數(shù)組類似,但可以利用GPU加速其數(shù)值計(jì)算。1312.1.2PyTorch框架Tensor的基本數(shù)據(jù)類型有以下五種:14
PyTorch框架基本操作12.1.2PyTorch框架數(shù)據(jù)類型CPU張量GPU張量32位浮點(diǎn)型torch.FloatTensor(默認(rèn))torch.cuda.FloatTensor64位浮點(diǎn)型torch.DoubleTensortorch.cuda.DoubleTensor64位整型torch.LongTensortorch.cuda.LongTensor32位整型torch.IntTensortorch.cuda.IntTensor16位整型torch.ShortTensortorch.cuda.ShortTensor(1)定義矩陣T1=torch.Tensor([[1,2],[3,4],[5,6]])print(T1)#定義全0矩陣T2=torch.zeros((3,2))#定義隨機(jī)值矩陣c=torch.randn((3,2))#定義全1矩陣d=torch.ones((3,2))15
PyTorch框架基本操作12.1.2PyTorch框架(2)獲取tensor的尺寸,元組x.shapex.size()(3)_在方法中的意義:表示對自身的改變x=torch.ones(3,4)#以下三個(gè)式子含義相同x=x+xx=torch.add(x,x)x.add_(x)16
PyTorch框架基本操作12.1.2PyTorch框架(4)索引:與numpy相同。x[:,1](5)改變形狀x.view(-1,4)x.view(4,3)(6)增加與降低維次T1=torch.Tensor([[1,2],[3,4]])print(T1)tensor([[1.,2.],[3.,4.]])17
PyTorch框架基本操作12.1.2PyTorch框架XX=X.unsqueeze(0)#在0維度增加1維print(XX)tensor([[[4.,8.],[12.,16.]]])YY=X.unsqueeze(1)#在1維度增加1維print(YY)tensor([[[4.,8.]],[[12.,16.]]])ZZ=YY.squeeze(1)#在1維度降低1維print(ZZ)tensor([[4.,8.],[12.,16.]])18
PyTorch框架基本操作12.1.2PyTorch框架(7)Tensor與Numpy之間轉(zhuǎn)換Numpy轉(zhuǎn)化為Tensor:torch.from_numpy(numpy矩陣)A=np.array([[1,2],[3,4],[5,6]])torch_A=torch.from_numpy(A)print(torch_A)Tensor轉(zhuǎn)化為numpy:Tensor矩陣.numpy()A=torch.randn((3,2))#隨機(jī)矩陣numpy_A=A.numpy()#轉(zhuǎn)換為Numpy矩陣print(numpy_A)19
PyTorch框架基本操作12.1.2PyTorch框架
變量(Variable)Pytorch框架最重要的數(shù)據(jù)類型為變量(Variable),其在張量的基礎(chǔ)上可實(shí)現(xiàn)輸入數(shù)據(jù)或模型的自動(dòng)求導(dǎo)、誤差的反向傳播等功能,在計(jì)算圖的構(gòu)建中具有極為重要的作用。本質(zhì)上Variable和Tensor沒有區(qū)別,不過變量(Variable)會(huì)通過計(jì)算圖實(shí)現(xiàn)前向傳播、反向傳播以及自動(dòng)求導(dǎo)。其機(jī)理與優(yōu)勢在于將所有的計(jì)算步驟(節(jié)點(diǎn))都連接起來,最后進(jìn)行誤差反向傳遞的時(shí)候,一次性將所有變量(Variable)相關(guān)的梯度均計(jì)算出來。2012.1.2PyTorch框架變量(Variable)基本屬性如下:(1)data屬性:表示當(dāng)前變量保存的數(shù)據(jù),可通過data屬性訪問。(2)grad屬性:累計(jì)與保存針對變量的梯度或求導(dǎo)結(jié)果。(3)creator屬性:Variable的操作(比如乘法或者加法等)。變量(Variable)在使用前需導(dǎo)入相關(guān)庫,即:fromtorch.autogradimportVariable21
變量(Variable)12.1.2PyTorch框架22
自動(dòng)求導(dǎo)12.1.2PyTorch框架實(shí)例分析:自動(dòng)求導(dǎo)importtorchfromtorch.autogradimportVariable#定義三個(gè)變量x=Variable(torch.Tensor([1,2,3]),requires_grad=True)w=Variable(torch.Tensor([2,3,4]),requires_grad=True)b=Variable(torch.Tensor([3,4,5]),requires_grad=True)#構(gòu)建計(jì)算圖(y=w*x^2+b)y=w*x*x+b#自動(dòng)求導(dǎo),計(jì)算梯度y.backward(torch.Tensor([1,1,1]))#輸出求結(jié)果print(x.grad)#x.grad=2wx=>tensor([4.,12.,24.])print(w.grad)#w.grad=x^2=>tensor([1.,4.,9.])print(b.grad)#b.grad=1=>tensor([1.,1.,1.])23
12.1.2PyTorch框架3.自動(dòng)求導(dǎo)在上述例子中,變量x、w與b在定義時(shí)將參數(shù)requires_grad設(shè)置為True的目的在于自動(dòng)實(shí)現(xiàn)對指定變量的求導(dǎo);此時(shí),針對該張量的所有前向傳播操作將構(gòu)造一個(gè)計(jì)算圖以用于計(jì)算神經(jīng)網(wǎng)絡(luò)中反向傳播時(shí)的梯度。4.計(jì)算圖與TensorFlow采用靜態(tài)計(jì)算圖不同,PyTorch框架的自動(dòng)求導(dǎo)通過定義動(dòng)態(tài)計(jì)算圖的方式實(shí)現(xiàn)。運(yùn)算與搭建同時(shí)進(jìn)行,靈活、易調(diào)節(jié)。計(jì)算圖是描述運(yùn)算的有向無環(huán)圖(圖中的節(jié)點(diǎn)為張量,邊為表示運(yùn)算的由輸出張量到輸入張量的映射函數(shù))。24
計(jì)算圖12.1.2PyTorch框架[實(shí)例]計(jì)算圖:利用數(shù)據(jù)(x,y)={(1,5),(2,10),(3,15)}擬合直線(真實(shí)直線:y=5*x)前向傳播:y=w*x【注:w為待求參數(shù)】反向傳播:通過梯度下降方法求參數(shù),利用backward()函數(shù)實(shí)現(xiàn)。計(jì)算圖:回顧:梯度下降方法基本思想與公式。源碼分析importtorchfromtorch.autogradimportVariablex=torch.Tensor([2])#輸入y=torch.Tensor([10])#輸出loss=torch.nn.MSELoss()#代價(jià)函數(shù)(均方差)w=Variable(torch.randn(1),requires_grad=True)#初始化參數(shù)print(w)25
計(jì)算圖12.1.2PyTorch框架回顧:代價(jià)函數(shù)與常用損失函數(shù)。foriinrange(10):#迭代10次
y_=w*x#前向傳播l=loss(y,y_)#計(jì)算誤差
l.backward()#反向傳播[求梯度]
print(w.grad.data)#誤差對w的導(dǎo)數(shù)
print(-2*x*(y-y_))#手工計(jì)算26
計(jì)算圖12.1.2PyTorch框架27
計(jì)算圖12.1.2PyTorch框架最后輸出如下(部分):tensor([-0.8820],requires_grad=True)#w初始為-0.8820tensor([-47.0557])#第1次迭代tensor([-47.0557],grad_fn=<MulBackward0>)tensor([-94.1115])#第2次迭代(累加)tensor([-47.0557],grad_fn=<MulBackward0>)tensor([-141.1672])#第3次迭代(累加)tensor([-47.0557],grad_fn=<MulBackward0>)tensor([-188.2230])#第4次迭代(累加)……思考:自動(dòng)與人工求取梯度的差異?28
計(jì)算圖12.1.2PyTorch框架Pytorch框架在計(jì)算梯度時(shí)會(huì)累加,需要用optimizer.zero_grad()清空梯度。上例只計(jì)算梯度而并沒有進(jìn)行梯度更新,以下在for循環(huán)里增加參數(shù)更新代碼。y_=w*x#前向傳播l=loss(y,y_)#計(jì)算誤差l.backward()#反向傳播print(w.grad.data)#誤差對w的導(dǎo)數(shù)w=Variable(w-0.1*w.grad.data,requires_grad=True)print(w)#更新后的參數(shù)print(-2*x*(y-y_))#手工計(jì)算29
計(jì)算圖12.1.2PyTorch框架最后輸出為:tensor([-56.4745])#誤差對w的導(dǎo)數(shù)tensor([3.5881],requires_grad=True)#參數(shù)wtensor([-56.4745],grad_fn=<MulBackward0>)#手工計(jì)算結(jié)果tensor([-11.2949])tensor([4.7176],requires_grad=True)tensor([-11.2949],grad_fn=<MulBackward0>)30
計(jì)算圖12.1.2PyTorch框架tensor([-2.2590])tensor([4.9435],requires_grad=True)#參數(shù)wtensor([-2.2590],grad_fn=<MulBackward0>)tensor([-0.4518])tensor([4.9887],requires_grad=True)#參數(shù)wtensor([-0.4518],grad_fn=<MulBackward0>)tensor([-0.0904])tensor([4.9977],requires_grad=True)#參數(shù)wtensor([-0.0904],grad_fn=<MulBackward0>)31
計(jì)算圖12.1.2PyTorch框架tensor([-0.0181])tensor([4.9995],requires_grad=True)#參數(shù)wtensor([-0.0181],grad_fn=<MulBackward0>)tensor([-0.0036])tensor([4.9999],requires_grad=True)#參數(shù)wtensor([-0.0036],grad_fn=<MulBackward0>)tensor([-0.0007])tensor([5.0000],requires_grad=True)#參數(shù)wtensor([-0.0007],grad_fn=<MulBackward0>)思考:梯度的變化?32
計(jì)算圖12.1.2PyTorch框架tensor([-0.0001])tensor([5.0000],requires_grad=True)#參數(shù)wtensor([-0.0001],grad_fn=<MulBackward0>)tensor([-3.0518e-05])tensor([5.0000],requires_grad=True)#最終達(dá)到最優(yōu)tensor([-3.0518e-05],grad_fn=<MulBackward0>)思考:梯度的變化規(guī)律?nn.Module類PyTorch沒有特別明顯的Layer和Module的區(qū)別,不管是自定義層、自定義模塊、自定義模型,都是通過繼承nn.Module類完成。在自定義網(wǎng)絡(luò)的時(shí)候,需要繼承nn.Module類并重新實(shí)現(xiàn)__init__()和forward()兩個(gè)方法。3312.1.2PyTorch框架nn.Module類importtorch.nnasnnimporttorch.nn.functionalasFclassNet(nn.Module):#重新實(shí)現(xiàn)__init__()函數(shù)
def__init__(self,n_feature,n_hidden,n_output):super(Net,self).__init__()self.hidden=nn.Linear(n_feature,n_hidden)self.out=nn.Linear(n_hidden,n_output)#重新實(shí)現(xiàn)forward()函數(shù)
defforward(self,x):
x=F.relu(self.hidden(x))x=self.out(x)returnx3412.1.2PyTorch框架思考:常用激活函數(shù)?nn.Module類網(wǎng)絡(luò)類定義之后,可以實(shí)例化網(wǎng)絡(luò)對象,即:>>>net=Net(n_feature=10,n_hidden=30,n_output=2)#實(shí)例化網(wǎng)絡(luò)對象>>>print(net)#輸出網(wǎng)絡(luò)結(jié)構(gòu)Net((hidden):Linear(in_features=10,out_features=30,bias=True)(out):Linear(in_features=30,out_features=2,bias=True))3512.1.2PyTorch框架
Sequential類Sequential繼承自Module類,其相當(dāng)于一個(gè)可包含多個(gè)層或模塊的容器以方便神經(jīng)網(wǎng)絡(luò)的構(gòu)建。Sequential類有以下三種不同的實(shí)現(xiàn)方式:(1)利用Sequential類構(gòu)建簡單的網(wǎng)絡(luò):在Sequential類實(shí)例化時(shí)將不同類型的層按指定順序排列以作為相關(guān)參數(shù)而構(gòu)建網(wǎng)絡(luò)。示例如下:3612.1.2PyTorch框架
Sequential類importtorch.nnasnnmodel=nn.Sequential(nn.Linear(10,30),nn.ReLU(),nn.Linear(30,2),)print(model)print(model[2])#通過索引獲取第幾個(gè)層3712.1.2PyTorch框架
Sequential類運(yùn)行結(jié)果為:Sequential((0):Linear(in_features=10,out_features=30,bias=True)(1):ReLU()(2):Linear(in_features=30,out_features=2,bias=True))Linear(in_features=30,out_features=2,bias=True)3812.1.2PyTorch框架
Sequential類(2)利用Sequential類構(gòu)建具有層名稱的網(wǎng)絡(luò):在Sequential類實(shí)例化時(shí)為每個(gè)構(gòu)成層指定相應(yīng)的名稱;此時(shí)需要導(dǎo)入OrderedDict庫。示例如下:importtorch.nnasnnfromcollectionsimportOrderedDictmodel=nn.Sequential(OrderedDict([(‘L1',nn.Linear(10,30)),(‘R1',nn.ReLU()),(‘L2',nn.Linear(30,2)),]))print(model)print(model[2])#通過索引獲取第幾個(gè)層3912.1.2PyTorch框架
Sequential類運(yùn)行結(jié)果為:Sequential((L1):Linear(in_features=10,out_features=30,bias=True)(R1):ReLU()(L2):Linear(in_features=30,out_features=2,bias=True))Linear(in_features=30,out_features=2,bias=True)需要注意,當(dāng)需訪問不同層時(shí),依然需要通過索引序號而不是層名稱實(shí)現(xiàn);即model[2]是正確的,而model["conv2"]是錯(cuò)誤的。4012.1.2PyTorch框架
Sequential類(3)利用Sequential類增量式構(gòu)建具有層名稱的網(wǎng)絡(luò):此方法首先實(shí)例化無參Sequential對象,然后通add_module()增量式地構(gòu)建相應(yīng)的層。示例如下:importtorch.nnasnnfromcollectionsimportOrderedDictmodel=nn.Sequential()model.add_module(‘L1’,nn.Linear(10,30))model.add_module(‘R1',nn.ReLU())model.add_module(‘L2',nn.Linear(30,2))print(model)print(model[2])#通過索引獲取第幾個(gè)層4112.1.2PyTorch框架
Sequential類Sequential((L1):Linear(in_features=10,out_features=30,bias=True)(R1):ReLU()(L2):Linear(in_features=30,out_features=2,bias=True))Linear(in_features=30,out_features=2,bias=True)add_module()方是定義于父類nn.Module類并由Sequential繼承;其定義如下:defadd_module(self,name,module):4212.1.2PyTorch框架
Sequential類[實(shí)例分析]利用Sequential構(gòu)建神經(jīng)網(wǎng)絡(luò)。在PyTorch中,nn類不但可定義輸入與輸出均為Tensor類型的網(wǎng)絡(luò)模塊,而且還保存相應(yīng)的內(nèi)部狀態(tài)(如需學(xué)習(xí)的Tesnor參數(shù))與定義相關(guān)損失函數(shù)(lossfunctions)以實(shí)現(xiàn)網(wǎng)絡(luò)的訓(xùn)練。在此例中,用nn類實(shí)現(xiàn)兩層神經(jīng)網(wǎng)絡(luò)。4312.1.2PyTorch框架
Sequential類importtorchN,D_in,H,D_out=64,1000,100,10#數(shù)據(jù)量、輸入維度、隱層維度與輸出維度#創(chuàng)建輸入與輸出隨機(jī)張量x=torch.randn(N,D_in)y=torch.randn(N,D_out)4412.1.2PyTorch框架
Sequential類#利用nn.Sequential類構(gòu)建包含兩個(gè)線性模塊與一個(gè)激活模塊的網(wǎng)絡(luò)(每個(gè)線性模塊使用線性函數(shù)從輸入計(jì)算輸出并保存其內(nèi)部的權(quán)重和偏差張量)。model=torch.nn.Sequential(torch.nn.Linear(D_in,H),torch.nn.ReLU(),torch.nn.Linear(H,D_out),)4512.1.2PyTorch框架
Sequential類#nn類還包含常用損失函數(shù)的定義;此例使用平均平方誤差(MSE)作為損失函數(shù)。loss_fn=torch.nn.MSELoss()learning_rate=1e-4#步長#開始網(wǎng)絡(luò)的訓(xùn)練T=500#設(shè)置迭代次數(shù)fortinrange(T):#前向傳播:向網(wǎng)絡(luò)傳入x計(jì)算預(yù)測的y。
y_pred=model(x)loss=loss_fn(y_pred,y)#計(jì)算損失
print(t,loss.item())#輸出損失4612.1.2PyTorch框架
Sequential類#反向傳播:計(jì)算損失相對所有可學(xué)習(xí)參數(shù)的導(dǎo)數(shù)(梯度)。網(wǎng)絡(luò)內(nèi)部每個(gè)模塊的參數(shù)存儲(chǔ)在requires_grad=True的張量中。
model.zero_grad()#梯度清零
loss.backward()#使用梯度下降方法更新權(quán)重。
withtorch.no_grad():forparaminmodel.parameters():param-=learning_rate*param.grad4712.1.2PyTorch框架
optim類對于簡單的網(wǎng)絡(luò)訓(xùn)練,可以通過手動(dòng)改變包含可學(xué)習(xí)參數(shù)張量的方式更新網(wǎng)絡(luò)的參數(shù);然而,對于復(fù)雜網(wǎng)絡(luò)的訓(xùn)練,通常需要使用AdaGrad、RMSProp、Adam等更復(fù)雜的優(yōu)化器更新參數(shù)。如定義Adam優(yōu)化器為:optimizer=torch.optim.Adam(net.parameters(),lr=1e-4)其中,net.parameters()方法用于獲取神經(jīng)網(wǎng)絡(luò)net的參數(shù),lr屬性用于設(shè)置相關(guān)學(xué)習(xí)率。4812.1.2PyTorch框架
optim類在此基礎(chǔ)上,可直接利用優(yōu)化器的zero_grad()方法與step()方法分別實(shí)現(xiàn)梯度的清零(避免累加)與參數(shù)的更新,即:optimizer.zero_grad()#梯度清零optimizer.step()#更新參數(shù)4912.1.2PyTorch框架
搭建網(wǎng)絡(luò)步驟1.定義模型:利用Sequential類或自定義類等方式定義模型。(1)通過Sequential類定義net=Sequential(nn.Linear(5,10),nn.Relu(),nn.Linear(10,20))5012.1.2PyTorch框架
搭建網(wǎng)絡(luò)步驟(2)通過自定義神經(jīng)網(wǎng)絡(luò)類(繼承nn.Module類)定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)classNet(nn.Module):def__init__(self):#自定義類
super(Net,self).__init__()self.fc1=nn.Linear(5,10)self.fc2=nn.Linear(10,20)defforward(self,x):x=self.fc1(x)x=nn.functional.relu(x)x=self.fc2(x)returnxnet=Net()#實(shí)例化5112.1.2PyTorch框架2.定義損失函數(shù)loss=nn.CrossEntropyLoss()3.定義優(yōu)化器optimizer=optim.SGD(net.parameters(),lr=0.01)4.網(wǎng)絡(luò)訓(xùn)練output=net(input)#前向傳播loss=criterion(output,target)#計(jì)算損失optimizer.zero_grad()#梯度清零loss.backward()#反向傳播optimizer.step()#更新參數(shù)52
搭建網(wǎng)絡(luò)步驟12.1.2PyTorch框架5.網(wǎng)絡(luò)測試output=net(input)6.保存與載入#保存與載入整個(gè)網(wǎng)絡(luò)模型torch.save(net,file)net=torch.load(file)#只保存與載入網(wǎng)絡(luò)模型參數(shù)(速度快,占內(nèi)存少)torch.save(model.state_dict(),file)net=Model()net.load_state_dict(file)53
搭建網(wǎng)絡(luò)步驟12.1.2PyTorch框架步驟7:參數(shù)讀取net.parameters()#讀取神經(jīng)網(wǎng)經(jīng)參數(shù)net.zero_grad()#神經(jīng)網(wǎng)經(jīng)參數(shù)梯度清零54
搭建網(wǎng)絡(luò)步驟12.1.2PyTorch框架
12.2.1回歸分析55
①問題描述首先根據(jù)指定斜率與截距的直線生成真實(shí)數(shù)據(jù)點(diǎn)并通過添加服從正態(tài)分布噪聲的方式生成觀測數(shù)據(jù)點(diǎn),然后構(gòu)建神經(jīng)網(wǎng)絡(luò)以根據(jù)觀測數(shù)據(jù)點(diǎn)求取相應(yīng)的直線,最終比較所求取直線與真實(shí)直線之間的偏差。
1.產(chǎn)生數(shù)據(jù)點(diǎn)#根據(jù)指定斜率與截距的直線生成真實(shí)數(shù)據(jù)點(diǎn)k,b=2,5#真實(shí)數(shù)據(jù)點(diǎn)x0=np.arange(0,10,0.2)y0=k*x0+5#生成噪聲服從正態(tài)分布的觀測數(shù)據(jù)點(diǎn)yn=y0+np.random.normal(0,2,50)56
12.2.1回歸分析
12.2.1回歸分析#顯示數(shù)據(jù)plt.figure('LinearRegression')plt.plot(x0,y0,'r',label='RealLine')plt.plot(x0,yn,'b.',label='NoisyPoints')plt.legend(loc='upperleft')#由Numpy數(shù)據(jù)轉(zhuǎn)換為張量x_train=torch.from_numpy(x0)y_train=torch.from_numpy(yn)#轉(zhuǎn)換為訓(xùn)練樣本x_train=x_train.unsqueeze(1)y_train=y_train.unsqueeze(1)#轉(zhuǎn)換為指定類型x_train=x_train.type(torch.FloatTensor)y_train=y_train.type(torch.FloatTensor)57
12.2.1回歸分析582.定義神經(jīng)網(wǎng)絡(luò)并實(shí)例化神經(jīng)網(wǎng)絡(luò)對象classLR(nn.Module):def__init__(self,In,H,Out):
super(LR,self).__init__()self.linear1=nn.Linear(In,H)self.linear2=nn.Linear(H,Out)defforward(self,x):x1=self.linear1(x)y=self.linear2(x1)returny
net=LR(1,2,1)##輸入與輸出維度為1維而隱層維度為2
12.2.1回歸分析3.構(gòu)建損失函數(shù)Loss=nn.MSELoss()
#采用均方差損失4.設(shè)置優(yōu)化器Opt=torch.optim.SGD(net.parameters(),lr=1e-2)5.神經(jīng)網(wǎng)絡(luò)訓(xùn)練T=1000
#設(shè)定訓(xùn)練次數(shù)59
12.2.1回歸分析forepochinrange(T):Y_=net(x_train)#前向傳播
L=Loss(y_train,Y_)#計(jì)算誤差
Opt.zero_grad()#梯度清零
L.backward()#反向傳播
Opt.step()#更新參數(shù)#顯示損失變化
if(epoch==0)|((epoch+1)%10==0):print('Epoch[{}/{}],Loss:{:.4f}'.format(epoch+1,T,L.item()))60
12.2.1回歸分析6.神經(jīng)網(wǎng)絡(luò)測試X=Variable(x_train)Y_pred=net(X)#預(yù)測出的Y值Y_pred=Y_pred.data.numpy()#顯示結(jié)果plt.figure()plt.plot(x0,y0,'r',label='RealLine')plt.plot(x0,yn,'b.',label='NoisyPoints')plt.plot(x0,Y_pred,'g',label='PredictedLine')plt.legend(loc='upperleft')61
12.2.1回歸分析7.查看參數(shù)print(list(net.parameters()))結(jié)果如下:[('linear1.weight',Parametercontaining:tensor([[1.5194],[0.4105]],requires_grad=True)),('linear1.bias',Parametercontaining:tensor([-2.4089,-0.7019],requires_grad=True)),('linear2.weight',Parametercontaining:tensor([[1.2464,0.3312]],requires_grad=True)),('linear2.bias',Parametercontaining:tensor([8.0681],requires_grad=True))]62思考:神經(jīng)網(wǎng)絡(luò)共幾層?每層的維度?參數(shù)數(shù)量與類型?
12.2.1回歸分析思考:1.神經(jīng)網(wǎng)絡(luò)中輸入與輸出之間的關(guān)系。2.神經(jīng)網(wǎng)絡(luò)參數(shù)與所求直線參數(shù)之間的關(guān)系?63
12.2.1回歸分析
64
12.2.1回歸分析
65
12.2.1回歸分析
66
12.2.1回歸分析67k=1.2464*1.5194+0.3312*0.4105=2.02973776b=1.2464*(-2.4089)+0.3312*(-0.7019)+8.0681=4.83317
12.2.1回歸分析在實(shí)際應(yīng)用中,兩連續(xù)型變量之間并不總呈線性關(guān)系,例如:研究拋物體的位置與時(shí)間的關(guān)系;藥物在體內(nèi)的濃度與時(shí)間的關(guān)系等。為了使研究結(jié)果更準(zhǔn)確,需建立能很好地?cái)M合研究變量關(guān)系的模型,即非線性回歸模型。68思考:采用什么模型可以較可靠地?cái)M合圖中的數(shù)據(jù)點(diǎn)?
非線性回歸
6912.2.1回歸分析非線性回歸#定義神經(jīng)網(wǎng)絡(luò)類并實(shí)例化神經(jīng)網(wǎng)絡(luò)對象classNLR(nn.Module):def__init__(self,n_feature,n_hidden,n_output):super(NLR,self).__init__()self.hidden=nn.Linear(n_feature,n_hidden)#隱層self.predict=nn.Linear(n_hidden,n_output)#輸出層defforward(self,x):x=self.hidden(x)#由輸入層到隱層x_act=F.relu(x)#ReLU激活y=self.predict(x_act)#由隱層到輸出層returnynet=NLR(1,10,1)#輸入與輸出維度為1維而隱層維度為107012.2.1回歸分析71#設(shè)置損失函數(shù)Loss=nn.MSELoss()#采用均方差損失Opt=torch.optim.SGD(net.parameters(),lr=1e-3)#設(shè)置優(yōu)化器#神經(jīng)網(wǎng)絡(luò)訓(xùn)練T=5000#設(shè)定迭代次數(shù)X=Variable(x_train)Y=Variable(y_train)非線性回歸12.2.1回歸分析非線性回歸forepochinrange(T):Y_pred=net(X)#向前傳播L=Loss(Y_pred,Y)#計(jì)算誤差Opt.zero_grad()#梯度清零L.backward()#誤差反傳Opt.step()#更新參數(shù)#輸出中間結(jié)果if(epoch==0)|((epoch+1)%10==0):print('Epoch[{}/{}],Loss:{:.4f}'.format(epoch+1,T,L.item()))
#展示中間結(jié)果plt.cla()plt.plot(X.numpy(),Y.numpy(),'ro')plt.plot(X.numpy(),Y_pred.detach().numpy(),c='b',lw=4)plt.text(-2,100,'Loss:%.4f'%L.item(),fontdict={'size':25,'color':'green'})plt.pause(0.1)7212.2.1回歸分析Logistic回歸算法在原理上主要用于解決兩類分類問題。Pw(x)=0.5時(shí)為分類界線此時(shí),hw(x)=0。即:w1x1+w2x2+w0=0兩類分界線:x2=K*x1+BK=-w1/w2B=-w0/w273
12.2.2Logistic回歸①問題描述首先構(gòu)造make_blobs數(shù)據(jù),然后利用PyTorch框架實(shí)現(xiàn)Logistic回歸算法以對樣本進(jìn)行分類并繪制分類效果圖。74
12.2.2Logistic回歸-兩類樣本分類1.導(dǎo)入庫importtorchfromtorchimportnnfromtorch.autogradimportVariableimportmatplotlib.pyplotaspltimportnumpyasnpfromsklearn.datasets.samples_generatorimportmake_blobs75
12.2.2Logistic回歸-兩類樣本分類2.構(gòu)造數(shù)據(jù)X,y=make_blobs(n_samples=500,n_features=2,centers=[[0,0],[1,2]],cluster_std=[0.4,0.5])#轉(zhuǎn)換為類型x_train=torch.tensor(X).type(torch.FloatTensor)y_train=torch.tensor(y).type(torch.FloatTensor)76
12.2.2Logistic回歸-兩類樣本分類3.構(gòu)建神經(jīng)網(wǎng)絡(luò)classL_NN(nn.Module):def__init__(self,n_feature):super(L_NN,self).__init__()self.lr=nn.Linear(n_feature,1)self.predict=nn.Sigmoid()defforward(self,x):x_=self.lr(x)y=self.predict(x_)returny.squeeze(-1)#調(diào)整格式以與訓(xùn)練y值格式相一致#實(shí)例化神經(jīng)網(wǎng)絡(luò)對象net=L_NN(2)#兩個(gè)維度對應(yīng)兩個(gè)特征77
12.2.2Logistic回歸-兩類樣本分類4.定義損失函數(shù)Loss=nn.BCELoss()#二元交叉熵?fù)p失函數(shù)#定義優(yōu)化器Opt=torch.optim.SGD(net.parameters(),lr=1e-3,momentum=0.9)#訓(xùn)練神經(jīng)網(wǎng)絡(luò)T=1000#設(shè)定迭代次數(shù)78
12.2.2Logistic回歸-兩類樣本分類5.訓(xùn)練網(wǎng)絡(luò)forepochinrange(T):
y_pred=net(x_train)#前向傳播L=Loss(y_pred,y_train)#計(jì)算損失Opt.zero_grad()#梯度清零L.backward()#誤差反傳Opt.step()#更新參數(shù)#計(jì)算預(yù)測精度label=y_pred.ge(0.5).float()#以0.5為閾值進(jìn)行分類acc=(label==y_train).float().mean()#計(jì)算精度#每10輪顯示一次誤差與精度
if(epoch==0)|((epoch+1)%10==0):print('Epoch:[{}/{}],Loss:{:.4f},Accuracy:{:.4f}'.format(epoch+1,T,L.item(),acc))79
12.2.2Logistic回歸-兩類樣本分類6.分類結(jié)果可視化w0,w1=net.lr.weight[0]w0=float(w0.item())w1=float(w1.item())b=float(net.lr.bias.item())plot_x=np.arange(min(X[:,0]),max(X[:,0]),0.1)plot_y=(-w0*plot_x-b)/w1plt.scatter(X[:,0],X[:,1],marker='o',s=50,c=y,cmap='RdYlGn',linewidths=1,edgecolors='k')plt.plot(plot_x,plot_y,color='b',lw=4)plt.show()80
12.2.2Logistic回歸-多類樣本分類
81
12.2.2Logistic回歸-多類樣本分類相對兩類樣本分類中的二元交叉熵?fù)p失函數(shù)BCELoss(),多類樣本分類通常采用多元交叉熵?fù)p失函數(shù)CrossEntropyLoss()。①問題描述手寫數(shù)字圖像數(shù)據(jù)(MNIST)集包含10個(gè)阿拉伯?dāng)?shù)字(即0~9共10個(gè)類別標(biāo)記)對應(yīng)的圖像(分辨率為28×28),訓(xùn)練圖像與測試圖像分別為60000幅與10000幅。82
12.2.2Logistic回歸-多類樣本分類在原始的MNIST數(shù)據(jù)集中,每張圖片都由一個(gè)28×28的矩陣表示。思考:10個(gè)類別,每個(gè)圖片的分類結(jié)果如何表示?83
12.2.2Logistic回歸-多類樣本分類每個(gè)圖片輸入神經(jīng)網(wǎng)絡(luò)后,輸出為10個(gè)類別的分類概率,從中求取最大概率對應(yīng)的類別即是該圖片所屬類別。思考:如何求最大概率?提示:利用torch.max()。84
12.2.2Logistic回歸-多類樣本分類問題:多個(gè)圖片如何同時(shí)求其類別?1:[0.5,0.1,0.1,0.2,0.1]2:[0.1,0.6,0.1,0.0,0.2]3:[0.0,0.3,0.7,0.0,0.0]利用torch.max()。_,label_opt=torch.max(label_pred,1)手寫數(shù)字?jǐn)?shù)據(jù)集可通過torchvision庫進(jìn)行加載,其中需要用到兩個(gè)類:(1)Dataset類:將數(shù)據(jù)封裝為DataLoader指定格式。在加載torchvision庫中的手寫數(shù)字?jǐn)?shù)據(jù)集時(shí),相應(yīng)的函數(shù)如下:datasets.MNIST(root,train=True,transform=None,download=False)root:下載后數(shù)據(jù)集存放位置。train:是否參與訓(xùn)練。transform:指定預(yù)處理操作。download:是否下載。
12.2.2Logistic回歸-多類樣本分類12.2.2Logistic回歸-多類樣本分類具體示例如下:train_dataset=datasets.MNIST(root='./data/',train=True,transform=img_transform,download=True)(2)DataLoader類:對Dataset類數(shù)據(jù)進(jìn)行批量選擇、并行處理等操作;相應(yīng)的函數(shù)定義如下:DataLoader(dataset,batch_size=1,shuffle=False,num_workers=0)dataset:Dataset數(shù)據(jù)集對象。batch_size:每次選擇的圖像數(shù)。shuffle::是否將數(shù)據(jù)打亂。num_workers:使用進(jìn)程數(shù)。問題:數(shù)據(jù)加載之后如何訪問?12.2.2Logistic回歸-多類樣本分類dataloader是一個(gè)可迭代對象,使用以下形式訪問其中的數(shù)據(jù):forindex,datainenumerate(dataloader,
start_index)
每次循環(huán)將讀取batch_size的數(shù)據(jù)。循環(huán)結(jié)束稱為一輪訓(xùn)練,可以設(shè)定多輪訓(xùn)練以提高模型訓(xùn)練的精度,其間可輸出訓(xùn)練精度或誤差以作觀察。12.2.2Logistic回歸-多類樣本分類【實(shí)例】enumerate函數(shù)使用。fromtorch.utils.dataimportTensorDatasetimporttorchfromtorch.utils.dataimportDataLoadera=torch.tensor([[1,2,3],[4,5,6],[7,8,9],[1,2,3],[4,5,6],[7,8,9],[1,2,3],[4,5,6],[7,8,9],[1,2,3],[4,5,6],[7,8,9]])b=torch.tensor([44,55,66,44,55,66,44,55,66,44,55,66])train_ids=TensorDataset(a,b)#封裝數(shù)據(jù)a與標(biāo)簽b12.2.2Logistic回歸-多類樣本分類train_loader=DataLoader(dataset=train_ids,batch_size=4,shuffle=True)fori,datainenumerate(train_loader,1):
x_data,label=dataprint('batch:{0}\nx_data:{1}\nlabel:{2}'.format(i,x_data,label))12.2.2Logistic回歸-多類樣本分類batch:1x_data:tensor([[7,8,9],[1,2,3],[1,2,3],[4,5,6]])label:tensor([66,44,44,55])batch:2x_data:tensor([[7,8,9],[4,5,6],[7,8,9],[1,2,3]])label:tensor([66,55,66,44])batch:3x_data:tensor([[4,5,6],[7,8,9],[1,2,3],[4,5,6]])label:tensor([55,66,44,55])12.2.2Logistic回歸-多類樣本分類1.導(dǎo)入庫importtorchfromtorchimportnnfromtorch.autogradimportVariableimportnumpyasnpimporttorchvisionfromtorchvisionimportdatasetsfromtorchvis
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 首爾與北京氣候的異同
- 盤點(diǎn)學(xué)生考試的試卷及答案
- 2025年甌海美術(shù)真題試卷及答案
- 2025年科目2模擬測試題及答案
- 承接工程運(yùn)輸合同范本
- 安裝清包工合同范本
- 數(shù)學(xué)老師有趣題庫及答案
- 四川省2024-2025學(xué)年高二上學(xué)期期中調(diào)研測試歷史試卷(含答案)
- 蔬菜酒店供貨合同范本
- 項(xiàng)目承包模式合同范本
- 文化創(chuàng)業(yè)街區(qū)創(chuàng)意
- 年會(huì)合同協(xié)議書模板
- 中西醫(yī)結(jié)合治療類風(fēng)濕關(guān)節(jié)炎疼痛
- 醫(yī)療人力資源效能評價(jià)指標(biāo)體系構(gòu)建
- 2025國際胰腺病學(xué)會(huì)急性胰腺炎修訂指南解讀課件
- 雨課堂學(xué)堂云在線《中國馬克思主義與當(dāng)代(北京化工大學(xué) )》單元測試考核答案
- 貴州省貴陽市2025-2026學(xué)年高三上學(xué)期11月質(zhì)量監(jiān)測化學(xué)試卷(含答案)
- 機(jī)場設(shè)備維修與保養(yǎng)操作手冊
- 動(dòng)脈穿刺法教案(2025-2026學(xué)年)
- 2025年《肌肉骨骼康復(fù)學(xué)》期末考試復(fù)習(xí)參考題庫(含答案)
- 工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)
評論
0/150
提交評論