bp神经网络隐含层神经元个数_CNN,残差网络,BP网络
(以下實驗均在MNIST中實現)
一、CNN與CNN改進的對比
眾所周知,對于CNN卷積神經網絡而言,隨著卷積層數的增加,其模型的準確度也會增加。那模型層數和準確度是無限地成正比例關系嗎?顯然不是的,眾多實驗已經證實,隨著網絡卷積層增加,準確度增加將逐漸趨緩。當模型卷積層增加到一定程度時,準確度幾乎停滯甚至還會降低。為什么會產生這種原因?
我們回想CNN的全稱:卷積神經網絡,他最初是在解決傳統(tǒng)的BP神經網絡面臨的參數爆炸而產生的。卷積核的引入大大減少了網絡每次需要更新的參數。但是,CNN神經網絡和傳統(tǒng)的BP神經網絡一樣,是一個典型的前饋神經網絡。前饋神經網絡參數的更新,需要一個梯度。這個梯度我們通過反向傳播時得到的傳播誤差求導得到。假設網絡某一層的誤差為
,而又依賴于其下一層的 。根據鏈式求導法則,我們推導得到:其中z是誤差的差值。當
小于1的時候,隨著層數的增加,其誤差也會迅速衰減,這也就意味著,梯度消失了。
為了解決這個問題,在網絡需要反向求導時,我們設法將淺層的梯度傳遞到深層去。這個時候,殘差神經網絡就出現了。
在求取當前層的梯度時,也將其前面層的梯度加入。這樣在一定程度上就增大了當前層梯度,或者說,減緩了當前層梯度的衰減。
為此,我們通多一系列實驗來進行檢測。
首先對于CNN來說,我們設計一個四層卷積神經網絡:
考慮到實驗的便捷性,我們僅設計每層有5個卷積核,卷積核的大小設為2,每次的步長設為1。
為與CNN網絡進行對比,我們同樣設計一個四層的殘差卷積網絡,每層5個卷積核,卷積核的大小為2,每次的移動步長設1。
同時,我們設置Batch-Size設為150,并在100次循環(huán)中,對比兩個模型的準確度和loss的變化。
如圖所示,兩個神經網絡在進行100次運算后,網絡的Loss值有著明顯的不同。改進后的網絡的Loss的降低速度更為迅速,且其最終的Loss也明顯低于傳統(tǒng)的CNN網絡。在這其中,傳統(tǒng)CNN的Loss最低為0.0410,而改進后的CNN的Loss則達到了0.0329。
另外我們繼續(xù)考察訓練完畢后其網絡的準確性。如圖所示:
同樣的,改進后的CNN相較于傳統(tǒng)的CNN網絡獲得了更好的預測準確度。改進后的CNN在更短的時間內獲得了更高的精度。在訓練集中,傳統(tǒng)CNN獲得了0.9915的準確度,而改進后的CNN獲得了0.9937的準確度。同樣的,在測試集合中,傳統(tǒng)CNN獲得了0.9881的準確度,而改進后的CNN獲得了0.9905的準確度。
實際上,通過兩個實驗我們可能感覺到二者的表現似乎不相上下,但是不要忘了,這兩個的網絡僅有4層,而且每層只有5個卷積核。如果模型的深度加深到數十層,并且卷積核的數目相應增加的話,兩者的差距應該是相當驚人的。
當然,所有的事情都是具有兩面性的。改進后的CNN,其模型更加復雜,相同情況下,為計算機的計算能力帶來了更大的壓力。
為了對比,我們將最初的DNN網絡引入。直白來說,BNN網絡就是將傳統(tǒng)的BP神經網絡進行了加深。
BP神經網絡由一個輸入層,一個隱含層,一個輸出層構成。為便于理解,我們可以將其看作一個傅里葉變換:將隱藏層的神經元看作一個個正弦函數,全連接權重相當于正弦函數的權重。傅里葉變換告訴我們,足夠多的正弦函數能夠擬合任何的曲線。因此我們有理由確定,足夠多的神經元可以擬合任何的結果。
為此,我們首先設置了一個四層的深度BP神經網絡,也就是DNN。
我們分別測試在隱藏層神經元個數為512,1024,2048情況下的準確度,并得到如下結果:
們逐漸增加神經元個數和隱藏層深度就能不斷提高網絡的準確度。但是,DNN神經網絡是一個全連接神經網絡。假設輸入層的特征維度為 n,與之相連的隱含層神經元個數為N,則此層的權重系數個數就為n*N。以此類推,如果一個3通道的大小為515*512*3的圖片,搭建一個擁有4層隱含層,每層1024個神經元的DNN網絡,僅首層需要更新的參數就達到512*512*3*1024約為8億個。這無異于是一個維數災難。
況且,對于一個經典的DNN前饋式神經網絡而言,隨著隱含層的增加,還將面臨著嚴重的梯度消失等一系列問題。
在此次實驗的最后,我們選取了每層2018個神經元,共計4層的DNN網絡,與前面提到的CNN和改進的CNN進行對比,得到如下圖片:
DNN無論從收斂速度,還是最終的準確度,都無法和CNN以及改進的CNN相比。
#殘差網絡 #卷積網絡 def cnn_model():r = "relu"ks = 2st = 1a = 0.005model = Sequential()model.add(normalization.BatchNormalization(input_shape=(28,28,1),beta_initializer='zero', gamma_initializer='one',name = "nor1"))model.add(Conv2D(5,kernel_size = ks,strides = st,activation=r,kernel_initializer='random_uniform',padding="same",name = "Cov1"))model.add(normalization.BatchNormalization(beta_init='zero', gamma_init='one',name = "nor2")) model.add(Conv2D(5,kernel_size = ks,strides = st,activation=r,kernel_initializer='random_uniform',padding="same",name = "Cov2"))model.add(MaxPooling2D(pool_size=2,name = "Max2")) model.add(normalization.BatchNormalization(beta_init='zero', gamma_init='one',name = "nor3")) model.add(Conv2D(5,kernel_size = ks,strides = st,activation=r,kernel_initializer='random_uniform',padding="same",name = "Cov3"))model.add(normalization.BatchNormalization(beta_init='zero', gamma_init='one',name = "nor4")) model.add(Conv2D(5,kernel_size = ks,strides = st,activation=r,kernel_initializer='random_uniform',padding="same",name = "Cov4"))model.add(MaxPooling2D(pool_size=2,name = "Max4")) model.add(Flatten(name = "Fla"))model.add(Dense(100,kernel_initializer='random_uniform',activation=r,W_regularizer=l2(a),b_regularizer=l2(a),name = "Den1"))model.add(Dropout(0.2))model.add(Dense(10,activation="softmax",name = "Den3"))sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='categorical_crossentropy',optimizer=sgd, metrics=['accuracy'])return model #BP網絡也可以說 r = "relu" ks = 3 st = 2 a = 0.008 input_img = Input(shape=(28*28,))input_img_bn = normalization.BatchNormalization(beta_initializer='zero', gamma_initializer='one')(input_img)dense1 = Dense(128,activation=r)(input_img_bn) dense1 = Dropout(0.2)(dense1)dense2 = Dense(256,activation=r)(dense1) dense2 = Dropout(0.2)(dense2)dense3 = Dense(512,activation=r)(dense2) dense3 = Dropout(0.2)(dense3)dense4 = Dense(512,activation=r)(dense3) dense4 = Dropout(0.2)(dense4)predictions = Dense(10, activation='softmax')(dense3)model = Model(inputs=input_img, outputs=predictions) print(model.summary())sgd = SGD(lr=0.001, momentum=0.0, decay=0.0, nesterov=False) model.compile(optimizer = sgd, loss='categorical_crossentropy',metrics=['accuracy'])總結
以上是生活随笔為你收集整理的bp神经网络隐含层神经元个数_CNN,残差网络,BP网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 早报:315晚会12大看点一文汇总 OP
- 下一篇: arduino i2c 如何写16位寄存