著名:?本文是從 Michael Nielsen的電子書Neural Network and Deep Learning的深度學(xué)習(xí)那一章的卷積神經(jīng)網(wǎng)絡(luò)的參數(shù)優(yōu)化方法的一些總結(jié)和摘錄,并不是我自己的結(jié)論和做實驗所得到的結(jié)果。我想Michael的實驗結(jié)果更有說服力一些。本書在github上有中文翻譯的版本,
前言
最近卷積神經(jīng)網(wǎng)絡(luò)(CNN)很火熱,它在圖像分類領(lǐng)域的卓越表現(xiàn)引起了大家的廣泛關(guān)注。本文總結(jié)和摘錄了Michael Nielsen的那本Neural Network and Deep Learning一書中關(guān)于深度學(xué)習(xí)一章中關(guān)于提高泛化能力的一些概述和實驗結(jié)果。力爭用數(shù)據(jù)給大家一個關(guān)于正則化,增加卷積層/全連接數(shù),棄權(quán)技術(shù),拓展訓(xùn)練集等參數(shù)優(yōu)化方法的效果。
本文并不會介紹正則化,棄權(quán)(Dropout), 池化等方法的原理,只會介紹它們在實驗中的應(yīng)用或者起到的效果,更多的關(guān)于這些方法的解釋請自行查詢。
mnist數(shù)據(jù)集介紹
本文的實驗是基于mnist數(shù)據(jù)集合的,mnist是一個從0到9的手寫數(shù)字集合,共有60,000張訓(xùn)練圖片,10,000張測試圖片。每張圖片大小是28*28大小。我們的實驗就是構(gòu)建一個神經(jīng)網(wǎng)絡(luò)來高精度的分類圖片,也就是提高泛化能力。
提高泛化能力的方法
一般來說,提高泛化能力的方法主要有以下幾個:
正則化
增加神經(jīng)網(wǎng)絡(luò)層數(shù)
使用正確的代價函數(shù)
使用好的權(quán)重初始化技術(shù)
人為拓展訓(xùn)練集
棄權(quán)技術(shù)
下面我們通過實驗結(jié)果給這些參數(shù)優(yōu)化理論一個直觀的結(jié)果
1. 普通的全連接神經(jīng)網(wǎng)絡(luò)的效果
我們使用一個隱藏層,包含100個隱藏神經(jīng)元,輸入層是784,輸出層是one-hot編碼的形式,最后一層是Softmax層。訓(xùn)練過程采用對數(shù)似然代價函數(shù),60次迭代,學(xué)習(xí)速率η=0.1,隨機梯度下降的小批量數(shù)據(jù)大小為10,沒有正則化。在測試集上得到的結(jié)果是97.8%,代碼如下:
>>> import network3
>>> from network3 import Network
>>> from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>> training_data, validation_data, test_data = network3.load_data_shared()
>>> mini_batch_size = 10
>>> net = Network([
FullyConnectedLayer(n_in=784, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data)
2.使用卷積神經(jīng)網(wǎng)絡(luò) — 僅一個卷積層
輸入層是卷積層,5*5的局部感受野,也就是一個5*5的卷積核,一共20個特征映射。最大池化層選用2*2的大小。后面是100個隱藏神經(jīng)元的全連接層。結(jié)構(gòu)如圖所示
在這個架構(gòu)中,我們把卷積層和chihua層看做是學(xué)習(xí)輸入訓(xùn)練圖像中的局部感受野,而后的全連接層則是一個更抽象層次的學(xué)習(xí),從整個圖像整合全局信息。也是60次迭代,批量數(shù)據(jù)大小是10,學(xué)習(xí)率是0.1.代碼如下,
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2)),
FullyConnectedLayer(n_in=20*12*12, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data)
經(jīng)過三次運行取平均后,準確率是98.78%,這是相當大的改善。錯誤率降低了1/3,。卷積神經(jīng)網(wǎng)絡(luò)開始顯現(xiàn)威力。
3.使用卷積神經(jīng)網(wǎng)絡(luò) — 兩個卷積層
我們接著插入第二個卷積-混合層,把它插入在之前的卷積-混合層和全連接層之間,同樣的5*5的局部感受野,2*2的池化層。
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2)),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2)),
FullyConnectedLayer(n_in=40*4*4, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data)
這一次,我們擁有了99.06%的準確率。
4.使用卷積神經(jīng)網(wǎng)絡(luò) — 兩個卷積層+線性修正單元(ReLU)+正則化
上面我們使用的Sigmod激活函數(shù),現(xiàn)在我們換成線性修正激活函數(shù)ReLU
f(z)=max(0,z),我們選擇60個迭代期,學(xué)習(xí)速率η=0.03, ,使用L2正則化,正則化參數(shù)λ=0.1,代碼如下
>>> from network3 import ReLU
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1)
這一次,我們獲得了99.23%的準確率,超過了S型激活函數(shù)的99.06%. ReLU的優(yōu)勢是max(0,z)中z取最大極限時不會飽和,不像是S函數(shù),這有助于持續(xù)學(xué)習(xí)。
5.使用卷積神經(jīng)網(wǎng)絡(luò) — 兩個卷基層+線性修正單元(ReLU)+正則化+拓展數(shù)據(jù)集
評論
查看更多