深度学习初级阶段——全连接神经网络(MLP、FNN)
在前面的數(shù)學(xué)原理篇中,已經(jīng)提到了各種深度學(xué)習(xí)的數(shù)學(xué)知識(shí)基本框架,那么從這篇文章開(kāi)始,我將和大家一起走進(jìn)深度學(xué)習(xí)的大門(部分圖片和描述取自其他文章)。
目錄
一、首先我們需要知道什么是深度學(xué)習(xí)?
二、了解神經(jīng)元與感知機(jī)
?三、全連接神經(jīng)網(wǎng)絡(luò)
四、神經(jīng)網(wǎng)絡(luò)框架(前向傳播)實(shí)例編寫
總結(jié)
一、首先我們需要知道什么是深度學(xué)習(xí)?
深度學(xué)習(xí)是機(jī)器學(xué)習(xí)領(lǐng)域中的一個(gè)新的研究方向,模仿生人類神經(jīng)網(wǎng)絡(luò),學(xué)習(xí)樣本數(shù)據(jù)的內(nèi)在規(guī)律的一種方法,神經(jīng)網(wǎng)絡(luò)屬于監(jiān)督學(xué)習(xí)的過(guò)程,可以處理:回歸、分類。
機(jī)器學(xué)習(xí):數(shù)據(jù)輸入——人工特征提取——分類——輸出
深度學(xué)習(xí):數(shù)據(jù)輸入——神經(jīng)網(wǎng)絡(luò)特征提取和分類——輸出
作用:圖像識(shí)別:物體,場(chǎng)景,人臉識(shí)別,跟蹤
自然語(yǔ)言處理(NLP):機(jī)器翻譯,文本識(shí)別
語(yǔ)音技術(shù):語(yǔ)言識(shí)別
主要框架:Pytorch(簡(jiǎn)單)、Tensorflow(適用工業(yè)界部署)、Mindspore(華為AI框架,脫敏)
二、了解神經(jīng)元與感知機(jī)
?關(guān)于神經(jīng)元的介紹我就不過(guò)多贅述了,大家只需要知道感知機(jī)模型就是一個(gè)簡(jiǎn)單的人工神經(jīng)網(wǎng)絡(luò)
(這里看不懂別太糾結(jié),后面實(shí)例將加深理解)
x(輸入)*w(權(quán)重w,b)——>Σwx+b求和——>output(輸出)
對(duì)感知機(jī)進(jìn)行數(shù)學(xué)建模
#通常我們把(w,b,統(tǒng)一稱為為W權(quán)重)
ΣW*X+b(矩陣相乘求和)(Σ求和,W權(quán)重,b偏置,x輸入)?
在上述的過(guò)程中感知機(jī)的輸入為線性,輸出也為線性,那么怎么用感知機(jī)解決非線性問(wèn)題呢?
感知機(jī)模型解決線性不可分問(wèn)題:感知機(jī)模型+激活函數(shù)(把線性變非線性)
?說(shuō)簡(jiǎn)單點(diǎn)就是把感知機(jī)的輸出,輸入到激活函數(shù)中,使其變成非線性。
其實(shí)感知機(jī)模型的完整圖是這樣的:
我們來(lái)看看激活函數(shù)的圖像大家就明白了:
激活函數(shù)的特點(diǎn):
Sigmoid:深層神經(jīng)網(wǎng)絡(luò)中極易造成梯度消失,使用于二分類問(wèn)題。
Softmax:多分類問(wèn)題,全概率,所有概率值加起來(lái)等于1
ReLU:不存在梯度消失(不飽和函數(shù)),丟掉不重要的特征(稀疏性),運(yùn)算簡(jiǎn)單,收斂速度快,更符合生物神經(jīng)網(wǎng)絡(luò)激活機(jī)制,常用于訓(xùn)練過(guò)程激活函數(shù)。
為什么要使用激活函數(shù):大家可以想像火車站排隊(duì)的欄桿,激活函數(shù)就是這樣不斷的約束引導(dǎo)輸入走向我們想要的目標(biāo),這才是它的底層含義,而它的用途就是把線性問(wèn)題變成非線性,以及把輸出映射到概率分布,方便我們進(jìn)行分類。
關(guān)于激活函數(shù)詳細(xì)請(qǐng)閱讀我的文章:
?實(shí)例:
(觀察左邊的函數(shù))g(x)為激活函數(shù)sigoid
#在計(jì)算機(jī)套件上運(yùn)行Calculator Suite - GeoGebra
實(shí)現(xiàn)MLP代碼:
## 感知機(jī)模型實(shí)例 import numpy as np import matplotlib.pyplot as plt """ #感知機(jī)是二分類的線性模型,其輸入是實(shí)例的特征向量,輸出的是事例的類別,分別是+1和-1,屬于判別模型 1.初始話權(quán)重向量w0,可以設(shè)置為隨機(jī)數(shù)等。但是要位于【-1,1】之間。 2. 指定學(xué)習(xí)率lr(步長(zhǎng),learning rate),介于(0,1)間。注意學(xué)習(xí)率過(guò)小,收斂速度較慢。但是如果較大,容易在達(dá)到期望輸出時(shí)產(chǎn)生波動(dòng)。 3. 開(kāi)始以下迭代3.1 計(jì)算學(xué)習(xí)信號(hào) R = D(期望輸出)-F(W'X)(訓(xùn)練輸出)3.2 計(jì)算權(quán)重調(diào)整 deltaW = lr*(D-R')*X3.3 更新權(quán)重 W0 = W0+deltaW 4.不斷訓(xùn)練直到訓(xùn)練輸出==期望輸出,或者正確率達(dá)到某個(gè)條件。 """ def Mlp(X, Y, weight, EPOCH, lr):# 在訓(xùn)練次數(shù)內(nèi),進(jìn)行以下迭代for epoch in range(EPOCH):# 計(jì)算當(dāng)前權(quán)重下的線性加權(quán)結(jié)果out=X.dot(weight)# 將當(dāng)前線性加權(quán)結(jié)果進(jìn)行sigmody= np.sign(out)#梯度下降# 根據(jù)實(shí)際輸出與期望輸出的差值調(diào)整權(quán)重delatW = lr * (Y - y.T).dot(X)# 調(diào)整權(quán)重weight = weight + delatWprint(y)# 判斷訓(xùn)練輸出結(jié)果和期望輸出結(jié)果是否相同if (Y == y).all():breakreturn weightif __name__ == "__main__":# 設(shè)置訓(xùn)練集X = np.array([[1, 4, 3], [1, 5, 4], [1, 4, 5], [1, 1, 1], [1, 2, 1], [1, 3, 2]])Y = np.array([1, 1, 1, -1, -1, -1])# 設(shè)置訓(xùn)練次數(shù)和學(xué)習(xí)率,初始權(quán)重([-1,1])EPOCH= 100lr = 0.1np.random.seed(4)weight = 2 * (np.random.random(3) - 0.5)# 開(kāi)始訓(xùn)練W = Mlp(X, Y, weight, EPOCH, lr)# 輸出分界線并繪圖x1 = np.array([1, 6])x2 = (-W[1] / W[2]) * x1 - W[0] / W[2]plt.plot(x1, x2)plt.plot(X[:, 1][0:3], X[:, 2][0:3], 'ro')plt.plot(X[:, 1][3:6], X[:, 2][3:6], 'b*')plt.show()?三、全連接神經(jīng)網(wǎng)絡(luò)
又稱深度神經(jīng)網(wǎng)絡(luò),多層感知機(jī)(MLP)結(jié)構(gòu),前面講到的感知機(jī)是它的基礎(chǔ),就像人類的反射弧是由很多個(gè)神經(jīng)元構(gòu)成的,全連接神經(jīng)網(wǎng)絡(luò)也由很多個(gè)感知機(jī)構(gòu)成。
全連接神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):
大家可以把每一個(gè)節(jié)點(diǎn)點(diǎn)想象成一個(gè)感知機(jī),每個(gè)結(jié)點(diǎn)和下一層所有節(jié)點(diǎn)都有運(yùn)算關(guān)系,這就是名稱中‘全連接’的含義,上圖的中間層也稱為隱藏層,全連接神經(jīng)網(wǎng)絡(luò)通常有多個(gè)隱藏層,增加隱藏層可以更好分離數(shù)據(jù)的特征,但過(guò)多的隱藏層也會(huì)增加訓(xùn)練時(shí)間以及產(chǎn)生過(guò)擬合。
全連接神經(jīng)網(wǎng)絡(luò)訓(xùn)練分為前向傳播、后向傳播兩個(gè)過(guò)程,前向傳播數(shù)據(jù)沿輸入到輸出后計(jì)算損失函數(shù)值,后向傳播則是一個(gè)優(yōu)化過(guò)程,利用梯度下降法減小前向傳播產(chǎn)生的損失函數(shù)值,從而優(yōu)化、更新參數(shù)。
拿這個(gè)兩層全連接神經(jīng)網(wǎng)絡(luò)舉例,層間激活函數(shù)為RuLE,最后一層的激活函數(shù)為SoftMax。輸入數(shù)據(jù)是一個(gè)3維向量,隱藏層有4個(gè)結(jié)點(diǎn),意味著通過(guò)線性映射將3維向量映射為一個(gè)4維向量,最后再變?yōu)橐粋€(gè)3維向量輸出,這里需注意:softmax一般用于多分類任務(wù)中,將輸出總和歸一化(做多分類輸出層的輸出函數(shù)),從而成為預(yù)測(cè)類別的概率分布,通常之后可以接交叉熵?fù)p失函數(shù)。
我們現(xiàn)在將輸出結(jié)果輸入到了sofmax激活函數(shù)中得到了樣本的概率分布,那么如何度量神經(jīng)網(wǎng)絡(luò)分類器預(yù)測(cè)分布和真實(shí)分布之間的距離呢??
這里我們先引入了一個(gè)方法One-hot一位有效編碼。類別的數(shù)量就是one-hot向量的維度,比如將三類編碼為:[0,0,1]、[0,1,0]、[1,0,0]。——這里需要注意我們是對(duì)真實(shí)值進(jìn)行編碼,不是預(yù)測(cè)值。
我們把樣本分布轉(zhuǎn)化為one-hot編碼,將分類值映射到整數(shù)就可以很好的表達(dá)類別了。這里的[1,0,0]就表示三類中的bird。
度量分類器預(yù)測(cè)分布和真實(shí)分布之間的誤差:用交叉熵?fù)p失函數(shù)
(上一篇文章有詳細(xì)講解:? ? ? ? ? ? ? ? ? ? ??這里就是用來(lái)衡量?jī)蓚€(gè)隨機(jī)分布差異(作為誤差))。
以上就是前向傳播(fp傳播)以及計(jì)算損失的過(guò)程,后面我們將逐步實(shí)現(xiàn)。
四、神經(jīng)網(wǎng)絡(luò)框架(前向傳播)實(shí)例編寫
下面我們用torch編寫一個(gè)簡(jiǎn)單的(隱藏層3+輸出層1)4層全連接神經(jīng)網(wǎng)絡(luò)框架
import torch#導(dǎo)入pytorch庫(kù) from torch import nn#神經(jīng)網(wǎng)絡(luò)模塊包括卷積層、池化層以及激活函等 #封裝一個(gè)全連接類 class Net_v1(nn.Module):#首先Net_v1繼承自nn.Module,#初始化函數(shù)(構(gòu)造函數(shù))def __init__(self):#通過(guò)super(python中的超類)完成父類的初始化。super().__init__()#實(shí)現(xiàn)全連接神經(jīng)網(wǎng)絡(luò)的定義,sequeential看成神經(jīng)網(wǎng)絡(luò)的容器self.layer=nn.Sequential(#輸入層:img.shapenn.Linear(1200*675*3,512),#這里的1200*675*3為圖片的尺寸加層數(shù)(h,w,rgb)#隱藏層(每一層的輸入是上一層的輸出nn.Linear(512,128),nn.Linear(128, 64),nn.Linear(64, 32),#輸出層nn.Linear(32,10),#由于是10分類所以最后一層為10#激活函數(shù)# 圖片的輸入是NV結(jié)構(gòu),N-批次(幾張圖片),V-體積(w*h*c)# 1200*675*3,激活v,dim=1,第二個(gè)維度(0,1)取圖片的體積nn.Softmax(dim=1))#前向計(jì)算(前向傳播),拿到計(jì)算結(jié)果def forward(self,x):return self.layer(x) if __name__ == '__main__':net_v1=Net_v1()x = torch.randn(1, 1200 * 675 * 3) # 傳隨機(jī)數(shù)測(cè)試(NV結(jié)構(gòu))y = net_v1.forward(x)#前向傳播print(y.shape)#前向傳播輸出形狀print(y,torch.sum(y))#前向傳播輸出的tensor(概率分布),sum=1輸出:
?可以看出我們的輸出為10個(gè)概率分布對(duì)應(yīng)于是分類。通過(guò)以上的代碼我們就完成了神經(jīng)網(wǎng)絡(luò)前向傳框架的構(gòu)建,接下來(lái)就是損失函數(shù)和反向傳播的部分了(持續(xù)更新)。
五、MNIST數(shù)據(jù)集處理
在上述的前向傳播的框架中,神經(jīng)網(wǎng)絡(luò)的輸入是一張1200*675*3的圖片輸出是1*10(10類)的概率分布,那么我們?nèi)绾螌⒋罅康臄?shù)據(jù)集作為輸入丟進(jìn)神經(jīng)網(wǎng)絡(luò)里面呢?我們需要對(duì)數(shù)據(jù)集進(jìn)行處理,后續(xù)我會(huì)以MNIST數(shù)據(jù)集(數(shù)據(jù)集分為訓(xùn)練集(train)和驗(yàn)證集(test))為例,為大家講解數(shù)據(jù)集處理的相關(guān)操作。
總結(jié)
在以上的學(xué)習(xí)中,我們明白了全連接神經(jīng)網(wǎng)絡(luò)的輸入(數(shù)據(jù)集TRAIN)和神經(jīng)網(wǎng)絡(luò)特征提取和分類的基本流程、最后的輸出(概率分布),并編寫了前向傳播所需的網(wǎng)絡(luò)框架,后面我們將學(xué)習(xí)構(gòu)建損失函數(shù)和如何利用損失函數(shù)進(jìn)行反向傳播更新權(quán)重,另外關(guān)于文中提到了方法里面的簡(jiǎn)單的數(shù)學(xué)知識(shí),大家可以看一下我之前的兩篇文章,由于本人現(xiàn)學(xué)現(xiàn)賣,不足之處還望指正。
總結(jié)
以上是生活随笔為你收集整理的深度学习初级阶段——全连接神经网络(MLP、FNN)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: E-Mobile 后台管理系统漏洞
- 下一篇: E0864vector不是模板