機器學習原理與應用課件 第12章 深度學習(基本原理+回歸)_第1頁
機器學習原理與應用課件 第12章 深度學習(基本原理+回歸)_第2頁
機器學習原理與應用課件 第12章 深度學習(基本原理+回歸)_第3頁
機器學習原理與應用課件 第12章 深度學習(基本原理+回歸)_第4頁
機器學習原理與應用課件 第12章 深度學習(基本原理+回歸)_第5頁
已閱讀5頁,還剩95頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第12章

深度學習1學習目標理解深度學習的基本原理。掌握PyTorch深度學習框架的基本操作。掌握常用深度學習模型的構建方法。1223目錄頁312.1基本原理12.2應用實例深度學習深度學習(DeepLearning)通過模擬人腦認識與分析問題的機理以對數據(例如圖像、聲音和文本)進行表征學習;相對于淺層人工神經網絡,深度學習通過增加隱層數量與優化訓練方法等方式提高其對數據內在規律的表達能力,因而可以有效地從數據中提取不同抽象層次的全局或局部特征以用于提高樣本分類的精度與可靠性。4在人工神經網絡的研究中,隱層結構(層次數量與每層神經元數量)是構建可靠的人工神經網絡的關鍵;從理論上而言,復雜的隱層結構表達能力強,但同時也易出現過擬合、難訓練等問題。(1)2006年,杰弗里·辛頓(GeoffreyHinton)《深度信念網的快速學習算法》中對人工神經網絡訓練中的梯度彌散(誤差反饋至前層時將變小)問題產生的根源進行了分析并初步提出了深度學習概念與相關框架,在學術圈引起了巨大的反響。(2)2012年,辛頓領導的團隊利用深度學習模型AlexNet在ImageNet圖像識別競賽奪冠之后,深度學習備受研究者的關注并在圖像理解、自然語言處理等諸多研究與應用領域迅猛發展,已逐步演化為人工神經網絡乃至機器學習中極為重要的分支。512.1基本原理1981年,諾貝爾醫學獎獲得者DavidHubel和TorstenWiesel人類視覺系統的信息處理機制進行深入地研究,發現了一種被稱為“方向選擇性細胞”的神經元細胞;此類神經元細胞當瞳孔發現了物體的邊緣指向某個方向時異常活躍。在此基礎上,人們進一步發現人類的視覺系統的信息處理是分級的,其主要表現在:6(1)人腦視覺機理12.1.1基本概念高層的特征是低層特征的組合,從低層到高層的特征表示越來越抽象,越來越能表現語義或者意圖。抽象層面越高,存在的可能猜測就越少,就越利于分類。7(1)人腦視覺機理12.1.1基本概念從數據中自動提取不同層次的局部或全部特征是深度學習的根本目的。根據辛頓針對深度學習的描述,其主要觀點如下。(1)多隱層的人工神經網絡具有優異的特征學習能力,學習得到的特征對數據有更本質的刻畫,從而更有利于可視化或分類;(2)深度神經網絡在訓練上的難度,可以通過無監督式的“逐層初始化”進行克服。本質上,深度學習以增加人工神經網絡隱層數或深度為手段并通過特定的訓練方式提高相關權重或參數求取的可靠性,進而實現層次化特征學習的目的。8(2)深度學習的提出12.1.1基本概念(1)強調模型結構深度:通常有幾十層或更多層。(2)明確突出了特征學習的重要性:通過逐層特征變換,將樣本在原空間的特征表示變換到一個新特征空間,從而使分類或預測更加容易。與人工規則構造特征的方法相比,利用大數據來學習特征,更能夠刻畫數據的豐富內在信息。(3)深度學習實現任意復雜函數的逼近。(4)深度學習采用逐層訓練機制。9(3)深度學習與淺層學習的區別12.1.1基本概念102017年1月,Facebook人工智能研究院(FAIR)基于Torch(由豐富機器學習算法支持的科學計算框架)推出了PyTorch深度神經網絡框架,經過幾年的發展,逐步成為人工智能領域相關方向科研與應用開發的利器。12.1.2PyTorch框架

12.1.2PyTorch框架11PyTorch框架的主要特點如下。(1)通過張量、變量與層/模塊等三級抽象層次實現神經網絡的構建,思路明晰、結構簡潔;同時具有簡單易用的API接口以方便不同層次相關結構的修改與操作,所需代碼量少且易于理解。API接口使用方法與科學計算庫Numpy非常類似,而且與Numpy之間可進行轉換。(2)與Tensorflow的靜態計算圖不同,PyTorch的計算圖是動態的(即可以根據計算需要實時改變計算圖)。(3)利用GPU運算加速以提高深度神經網絡的訓練與測試的效率。

Anaconda安裝首先進入PyTorch官網(網址:/)獲取安裝命令,然后在conda命令環境下執行。以Windows10操作系統、Python3.7為例,由于本機未安裝CUDA,因而選擇CUDA項的None配置。1212.1.2PyTorch框架

PyTorch框架基本操作PyTorch框架利用張量(Tensor)實現數據的加速運算,從而解決深度神經網絡運算量巨大而Numpy庫無法利用GPU進行數據加速運算的問題。導入PyTorch庫:importtorch1.張量(Tensor)Pytorch框架最基本的操作對象為張量(Tensor),其在結構上與Numpy庫中的多維數組類似,但可以利用GPU加速其數值計算。1312.1.2PyTorch框架Tensor的基本數據類型有以下五種:14

PyTorch框架基本操作12.1.2PyTorch框架數據類型CPU張量GPU張量32位浮點型torch.FloatTensor(默認)torch.cuda.FloatTensor64位浮點型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))#定義隨機值矩陣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)#以下三個式子含義相同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之間轉換Numpy轉化為Tensor:torch.from_numpy(numpy矩陣)A=np.array([[1,2],[3,4],[5,6]])torch_A=torch.from_numpy(A)print(torch_A)Tensor轉化為numpy:Tensor矩陣.numpy()A=torch.randn((3,2))#隨機矩陣numpy_A=A.numpy()#轉換為Numpy矩陣print(numpy_A)19

PyTorch框架基本操作12.1.2PyTorch框架

變量(Variable)Pytorch框架最重要的數據類型為變量(Variable),其在張量的基礎上可實現輸入數據或模型的自動求導、誤差的反向傳播等功能,在計算圖的構建中具有極為重要的作用。本質上Variable和Tensor沒有區別,不過變量(Variable)會通過計算圖實現前向傳播、反向傳播以及自動求導。其機理與優勢在于將所有的計算步驟(節點)都連接起來,最后進行誤差反向傳遞的時候,一次性將所有變量(Variable)相關的梯度均計算出來。2012.1.2PyTorch框架變量(Variable)基本屬性如下:(1)data屬性:表示當前變量保存的數據,可通過data屬性訪問。(2)grad屬性:累計與保存針對變量的梯度或求導結果。(3)creator屬性:Variable的操作(比如乘法或者加法等)。變量(Variable)在使用前需導入相關庫,即:fromtorch.autogradimportVariable21

變量(Variable)12.1.2PyTorch框架22

自動求導12.1.2PyTorch框架實例分析:自動求導importtorchfromtorch.autogradimportVariable#定義三個變量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)#構建計算圖(y=w*x^2+b)y=w*x*x+b#自動求導,計算梯度y.backward(torch.Tensor([1,1,1]))#輸出求結果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.自動求導在上述例子中,變量x、w與b在定義時將參數requires_grad設置為True的目的在于自動實現對指定變量的求導;此時,針對該張量的所有前向傳播操作將構造一個計算圖以用于計算神經網絡中反向傳播時的梯度。4.計算圖與TensorFlow采用靜態計算圖不同,PyTorch框架的自動求導通過定義動態計算圖的方式實現。運算與搭建同時進行,靈活、易調節。計算圖是描述運算的有向無環圖(圖中的節點為張量,邊為表示運算的由輸出張量到輸入張量的映射函數)。24

計算圖12.1.2PyTorch框架[實例]計算圖:利用數據(x,y)={(1,5),(2,10),(3,15)}擬合直線(真實直線:y=5*x)前向傳播:y=w*x【注:w為待求參數】反向傳播:通過梯度下降方法求參數,利用backward()函數實現。計算圖:回顧:梯度下降方法基本思想與公式。源碼分析importtorchfromtorch.autogradimportVariablex=torch.Tensor([2])#輸入y=torch.Tensor([10])#輸出loss=torch.nn.MSELoss()#代價函數(均方差)w=Variable(torch.randn(1),requires_grad=True)#初始化參數print(w)25

計算圖12.1.2PyTorch框架回顧:代價函數與常用損失函數。foriinrange(10):#迭代10次

y_=w*x#前向傳播l=loss(y,y_)#計算誤差

l.backward()#反向傳播[求梯度]

print(w.grad.data)#誤差對w的導數

print(-2*x*(y-y_))#手工計算26

計算圖12.1.2PyTorch框架27

計算圖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次迭代(累加)……思考:自動與人工求取梯度的差異?28

計算圖12.1.2PyTorch框架Pytorch框架在計算梯度時會累加,需要用optimizer.zero_grad()清空梯度。上例只計算梯度而并沒有進行梯度更新,以下在for循環里增加參數更新代碼。y_=w*x#前向傳播l=loss(y,y_)#計算誤差l.backward()#反向傳播print(w.grad.data)#誤差對w的導數w=Variable(w-0.1*w.grad.data,requires_grad=True)print(w)#更新后的參數print(-2*x*(y-y_))#手工計算29

計算圖12.1.2PyTorch框架最后輸出為:tensor([-56.4745])#誤差對w的導數tensor([3.5881],requires_grad=True)#參數wtensor([-56.4745],grad_fn=<MulBackward0>)#手工計算結果tensor([-11.2949])tensor([4.7176],requires_grad=True)tensor([-11.2949],grad_fn=<MulBackward0>)30

計算圖12.1.2PyTorch框架tensor([-2.2590])tensor([4.9435],requires_grad=True)#參數wtensor([-2.2590],grad_fn=<MulBackward0>)tensor([-0.4518])tensor([4.9887],requires_grad=True)#參數wtensor([-0.4518],grad_fn=<MulBackward0>)tensor([-0.0904])tensor([4.9977],requires_grad=True)#參數wtensor([-0.0904],grad_fn=<MulBackward0>)31

計算圖12.1.2PyTorch框架tensor([-0.0181])tensor([4.9995],requires_grad=True)#參數wtensor([-0.0181],grad_fn=<MulBackward0>)tensor([-0.0036])tensor([4.9999],requires_grad=True)#參數wtensor([-0.0036],grad_fn=<MulBackward0>)tensor([-0.0007])tensor([5.0000],requires_grad=True)#參數wtensor([-0.0007],grad_fn=<MulBackward0>)思考:梯度的變化?32

計算圖12.1.2PyTorch框架tensor([-0.0001])tensor([5.0000],requires_grad=True)#參數wtensor([-0.0001],grad_fn=<MulBackward0>)tensor([-3.0518e-05])tensor([5.0000],requires_grad=True)#最終達到最優tensor([-3.0518e-05],grad_fn=<MulBackward0>)思考:梯度的變化規律?nn.Module類PyTorch沒有特別明顯的Layer和Module的區別,不管是自定義層、自定義模塊、自定義模型,都是通過繼承nn.Module類完成。在自定義網絡的時候,需要繼承nn.Module類并重新實現__init__()和forward()兩個方法。3312.1.2PyTorch框架nn.Module類importtorch.nnasnnimporttorch.nn.functionalasFclassNet(nn.Module):#重新實現__init__()函數

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)#重新實現forward()函數

defforward(self,x):

x=F.relu(self.hidden(x))x=self.out(x)returnx3412.1.2PyTorch框架思考:常用激活函數?nn.Module類網絡類定義之后,可以實例化網絡對象,即:>>>net=Net(n_feature=10,n_hidden=30,n_output=2)#實例化網絡對象>>>print(net)#輸出網絡結構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類,其相當于一個可包含多個層或模塊的容器以方便神經網絡的構建。Sequential類有以下三種不同的實現方式:(1)利用Sequential類構建簡單的網絡:在Sequential類實例化時將不同類型的層按指定順序排列以作為相關參數而構建網絡。示例如下:3612.1.2PyTorch框架

Sequential類importtorch.nnasnnmodel=nn.Sequential(nn.Linear(10,30),nn.ReLU(),nn.Linear(30,2),)print(model)print(model[2])#通過索引獲取第幾個層3712.1.2PyTorch框架

Sequential類運行結果為: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類構建具有層名稱的網絡:在Sequential類實例化時為每個構成層指定相應的名稱;此時需要導入OrderedDict庫。示例如下:importtorch.nnasnnfromcollectionsimportOrderedDictmodel=nn.Sequential(OrderedDict([(‘L1',nn.Linear(10,30)),(‘R1',nn.ReLU()),(‘L2',nn.Linear(30,2)),]))print(model)print(model[2])#通過索引獲取第幾個層3912.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)需要注意,當需訪問不同層時,依然需要通過索引序號而不是層名稱實現;即model[2]是正確的,而model["conv2"]是錯誤的。4012.1.2PyTorch框架

Sequential類(3)利用Sequential類增量式構建具有層名稱的網絡:此方法首先實例化無參Sequential對象,然后通add_module()增量式地構建相應的層。示例如下: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])#通過索引獲取第幾個層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類[實例分析]利用Sequential構建神經網絡。在PyTorch中,nn類不但可定義輸入與輸出均為Tensor類型的網絡模塊,而且還保存相應的內部狀態(如需學習的Tesnor參數)與定義相關損失函數(lossfunctions)以實現網絡的訓練。在此例中,用nn類實現兩層神經網絡。4312.1.2PyTorch框架

Sequential類importtorchN,D_in,H,D_out=64,1000,100,10#數據量、輸入維度、隱層維度與輸出維度#創建輸入與輸出隨機張量x=torch.randn(N,D_in)y=torch.randn(N,D_out)4412.1.2PyTorch框架

Sequential類#利用nn.Sequential類構建包含兩個線性模塊與一個激活模塊的網絡(每個線性模塊使用線性函數從輸入計算輸出并保存其內部的權重和偏差張量)。model=torch.nn.Sequential(torch.nn.Linear(D_in,H),torch.nn.ReLU(),torch.nn.Linear(H,D_out),)4512.1.2PyTorch框架

Sequential類#nn類還包含常用損失函數的定義;此例使用平均平方誤差(MSE)作為損失函數。loss_fn=torch.nn.MSELoss()learning_rate=1e-4#步長#開始網絡的訓練T=500#設置迭代次數fortinrange(T):#前向傳播:向網絡傳入x計算預測的y。

y_pred=model(x)loss=loss_fn(y_pred,y)#計算損失

print(t,loss.item())#輸出損失4612.1.2PyTorch框架

Sequential類#反向傳播:計算損失相對所有可學習參數的導數(梯度)。網絡內部每個模塊的參數存儲在requires_grad=True的張量中。

model.zero_grad()#梯度清零

loss.backward()#使用梯度下降方法更新權重。

withtorch.no_grad():forparaminmodel.parameters():param-=learning_rate*param.grad4712.1.2PyTorch框架

optim類對于簡單的網絡訓練,可以通過手動改變包含可學習參數張量的方式更新網絡的參數;然而,對于復雜網絡的訓練,通常需要使用AdaGrad、RMSProp、Adam等更復雜的優化器更新參數。如定義Adam優化器為:optimizer=torch.optim.Adam(net.parameters(),lr=1e-4)其中,net.parameters()方法用于獲取神經網絡net的參數,lr屬性用于設置相關學習率。4812.1.2PyTorch框架

optim類在此基礎上,可直接利用優化器的zero_grad()方法與step()方法分別實現梯度的清零(避免累加)與參數的更新,即:optimizer.zero_grad()#梯度清零optimizer.step()#更新參數4912.1.2PyTorch框架

搭建網絡步驟1.定義模型:利用Sequential類或自定義類等方式定義模型。(1)通過Sequential類定義net=Sequential(nn.Linear(5,10),nn.Relu(),nn.Linear(10,20))5012.1.2PyTorch框架

搭建網絡步驟(2)通過自定義神經網絡類(繼承nn.Module類)定義神經網絡結構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()#實例化5112.1.2PyTorch框架2.定義損失函數loss=nn.CrossEntropyLoss()3.定義優化器optimizer=optim.SGD(net.parameters(),lr=0.01)4.網絡訓練output=net(input)#前向傳播loss=criterion(output,target)#計算損失optimizer.zero_grad()#梯度清零loss.backward()#反向傳播optimizer.step()#更新參數52

搭建網絡步驟12.1.2PyTorch框架5.網絡測試output=net(input)6.保存與載入#保存與載入整個網絡模型torch.save(net,file)net=torch.load(file)#只保存與載入網絡模型參數(速度快,占內存少)torch.save(model.state_dict(),file)net=Model()net.load_state_dict(file)53

搭建網絡步驟12.1.2PyTorch框架步驟7:參數讀取net.parameters()#讀取神經網經參數net.zero_grad()#神經網經參數梯度清零54

搭建網絡步驟12.1.2PyTorch框架

12.2.1回歸分析55

①問題描述首先根據指定斜率與截距的直線生成真實數據點并通過添加服從正態分布噪聲的方式生成觀測數據點,然后構建神經網絡以根據觀測數據點求取相應的直線,最終比較所求取直線與真實直線之間的偏差。

1.產生數據點#根據指定斜率與截距的直線生成真實數據點k,b=2,5#真實數據點x0=np.arange(0,10,0.2)y0=k*x0+5#生成噪聲服從正態分布的觀測數據點yn=y0+np.random.normal(0,2,50)56

12.2.1回歸分析

12.2.1回歸分析#顯示數據plt.figure('LinearRegression')plt.plot(x0,y0,'r',label='RealLine')plt.plot(x0,yn,'b.',label='NoisyPoints')plt.legend(loc='upperleft')#由Numpy數據轉換為張量x_train=torch.from_numpy(x0)y_train=torch.from_numpy(yn)#轉換為訓練樣本x_train=x_train.unsqueeze(1)y_train=y_train.unsqueeze(1)#轉換為指定類型x_train=x_train.type(torch.FloatTensor)y_train=y_train.type(torch.FloatTensor)57

12.2.1回歸分析582.定義神經網絡并實例化神經網絡對象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.構建損失函數Loss=nn.MSELoss()

#采用均方差損失4.設置優化器Opt=torch.optim.SGD(net.parameters(),lr=1e-2)5.神經網絡訓練T=1000

#設定訓練次數59

12.2.1回歸分析forepochinrange(T):Y_=net(x_train)#前向傳播

L=Loss(y_train,Y_)#計算誤差

Opt.zero_grad()#梯度清零

L.backward()#反向傳播

Opt.step()#更新參數#顯示損失變化

if(epoch==0)|((epoch+1)%10==0):print('Epoch[{}/{}],Loss:{:.4f}'.format(epoch+1,T,L.item()))60

12.2.1回歸分析6.神經網絡測試X=Variable(x_train)Y_pred=net(X)#預測出的Y值Y_pred=Y_pred.data.numpy()#顯示結果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.查看參數print(list(net.parameters()))結果如下:[('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思考:神經網絡共幾層?每層的維度?參數數量與類型?

12.2.1回歸分析思考:1.神經網絡中輸入與輸出之間的關系。2.神經網絡參數與所求直線參數之間的關系?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回歸分析在實際應用中,兩連續型變量之間并不總呈線性關系,例如:研究拋物體的位置與時間的關系;藥物在體內的濃度與時間的關系等。為了使研究結果更準確,需建立能很好地擬合研究變量關系的模型,即非線性回歸模型。68思考:采用什么模型可以較可靠地擬合圖中的數據點?

非線性回歸

6912.2.1回歸分析非線性回歸#定義神經網絡類并實例化神經網絡對象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#設置損失函數Loss=nn.MSELoss()#采用均方差損失Opt=torch.optim.SGD(net.parameters(),lr=1e-3)#設置優化器#神經網絡訓練T=5000#設定迭代次數X=Variable(x_train)Y=Variable(y_train)非線性回歸12.2.1回歸分析非線性回歸forepochinrange(T):Y_pred=net(X)#向前傳播L=Loss(Y_pred,Y)#計算誤差Opt.zero_grad()#梯度清零L.backward()#誤差反傳Opt.step()#更新參數#輸出中間結果if(epoch==0)|((epoch+1)%10==0):print('Epoch[{}/{}],Loss:{:.4f}'.format(epoch+1,T,L.item()))

#展示中間結果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時為分類界線此時,hw(x)=0。即:w1x1+w2x2+w0=0兩類分界線:x2=K*x1+BK=-w1/w2B=-w0/w273

12.2.2Logistic回歸①問題描述首先構造make_blobs數據,然后利用PyTorch框架實現Logistic回歸算法以對樣本進行分類并繪制分類效果圖。74

12.2.2Logistic回歸-兩類樣本分類1.導入庫importtorchfromtorchimportnnfromtorch.autogradimportVariableimportmatplotlib.pyplotaspltimportnumpyasnpfromsklearn.datasets.samples_generatorimportmake_blobs75

12.2.2Logistic回歸-兩類樣本分類2.構造數據X,y=make_blobs(n_samples=500,n_features=2,centers=[[0,0],[1,2]],cluster_std=[0.4,0.5])#轉換為類型x_train=torch.tensor(X).type(torch.FloatTensor)y_train=torch.tensor(y).type(torch.FloatTensor)76

12.2.2Logistic回歸-兩類樣本分類3.構建神經網絡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)#調整格式以與訓練y值格式相一致#實例化神經網絡對象net=L_NN(2)#兩個維度對應兩個特征77

12.2.2Logistic回歸-兩類樣本分類4.定義損失函數Loss=nn.BCELoss()#二元交叉熵損失函數#定義優化器Opt=torch.optim.SGD(net.parameters(),lr=1e-3,momentum=0.9)#訓練神經網絡T=1000#設定迭代次數78

12.2.2Logistic回歸-兩類樣本分類5.訓練網絡forepochinrange(T):

y_pred=net(x_train)#前向傳播L=Loss(y_pred,y_train)#計算損失Opt.zero_grad()#梯度清零L.backward()#誤差反傳Opt.step()#更新參數#計算預測精度label=y_pred.ge(0.5).float()#以0.5為閾值進行分類acc=(label==y_train).float().mean()#計算精度#每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.分類結果可視化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回歸-多類樣本分類相對兩類樣本分類中的二元交叉熵損失函數BCELoss(),多類樣本分類通常采用多元交叉熵損失函數CrossEntropyLoss()。①問題描述手寫數字圖像數據(MNIST)集包含10個阿拉伯數字(即0~9共10個類別標記)對應的圖像(分辨率為28×28),訓練圖像與測試圖像分別為60000幅與10000幅。82

12.2.2Logistic回歸-多類樣本分類在原始的MNIST數據集中,每張圖片都由一個28×28的矩陣表示。思考:10個類別,每個圖片的分類結果如何表示?83

12.2.2Logistic回歸-多類樣本分類每個圖片輸入神經網絡后,輸出為10個類別的分類概率,從中求取最大概率對應的類別即是該圖片所屬類別。思考:如何求最大概率?提示:利用torch.max()。84

12.2.2Logistic回歸-多類樣本分類問題:多個圖片如何同時求其類別?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)手寫數字數據集可通過torchvision庫進行加載,其中需要用到兩個類:(1)Dataset類:將數據封裝為DataLoader指定格式。在加載torchvision庫中的手寫數字數據集時,相應的函數如下:datasets.MNIST(root,train=True,transform=None,download=False)root:下載后數據集存放位置。train:是否參與訓練。transform:指定預處理操作。download:是否下載。

12.2.2Logistic回歸-多類樣本分類12.2.2Logistic回歸-多類樣本分類具體示例如下:train_dataset=datasets.MNIST(root='./data/',train=True,transform=img_transform,download=True)(2)DataLoader類:對Dataset類數據進行批量選擇、并行處理等操作;相應的函數定義如下:DataLoader(dataset,batch_size=1,shuffle=False,num_workers=0)dataset:Dataset數據集對象。batch_size:每次選擇的圖像數。shuffle::是否將數據打亂。num_workers:使用進程數。問題:數據加載之后如何訪問?12.2.2Logistic回歸-多類樣本分類dataloader是一個可迭代對象,使用以下形式訪問其中的數據:forindex,datainenumerate(dataloader,

start_index)

每次循環將讀取batch_size的數據。循環結束稱為一輪訓練,可以設定多輪訓練以提高模型訓練的精度,其間可輸出訓練精度或誤差以作觀察。12.2.2Logistic回歸-多類樣本分類【實例】enumerate函數使用。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)#封裝數據a與標簽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.導入庫importtorchfromtorchimportnnfromtorch.autogradimportVariableimportnumpyasnpimporttorchvisionfromtorchvisionimportdatasetsfromtorchvis

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論