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