Alexnet訓練Cifar10

Alexnet作爲經典網絡,值得深度學習。通過實驗,(1)儘可能的加深對paper一些創新點理解。AlexNet謎一般的input是224*224,實際上應該是227*227。在實驗中,我採用的是cifar10,輸入是32*32。所以將網絡參數同比簡化。(2)儘可能理解不同訓練方法帶來的區別。

數據集:http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
訓練用的代碼: https://github.com/diudiuzhi/TensorAlexnet

python train.py

Alexnet特點:

  • 1 引入relu
  • 2 GPU並行計算
  • 3 LRN
  • 4 Overlapping Pooling
  • 5 引入Dropout
  • 6 Data Augmentation

第一點,不驗證,之後的網絡都是使用relu。MSRAnet提出的Prelu也是爲了解決relu負域梯度0的問題。
第二點,不驗證,Alex當時單塊GPU內存3Gb,不足以訓練網絡,於是採用兩塊GPU並行。另外他的架構中存在網絡不對稱性。並宣稱這一點對他結果有貢獻。
第三點,實驗驗證:帶LRN和不帶LRN訓練結果差距,時間開銷。後續論文評價LRN,對結果並沒有特別的貢獻,但是極費時間。
第四點,不驗證。
第五點,dropout用於防止過擬合,在這裏測試不同的 dropout對結果和時間的影響。
第六點,測試數據增強對網絡的影響。

本篇博客將從以下幾點實驗:
1)驗證不同學習率對網絡的影響。
2) 驗證不同的優化器對網絡的影響。
3)驗證LRN對網絡的影響。
4)驗證dropout對網絡的影響。
5)驗證不同初始化方式對網絡的影響。(MSRA提出)
6)驗證數據增強對網絡的影響。

網絡基礎結構:
Input: 32*32*3

Padding: SAME
kernel: 3*3
stride: 1

Conv1:
channel: 24
lrn
max pool: 2*2

Conv2:
channel: 96
lrn
max pool: 2*2

Conv3:
channel: 192

Conv4:
channel: 192

Conv5:
channel: 96
max_pool: 2*2

FC1:
98304 * 1024

FC2:
1024*1024

FC3:
1024*10

實驗1:
訓練集: 45k
驗證集: 5k
測試集: 10k
Momentum 0.9
epoch: 60
batch size: 64
dropout: 0.9
權值初始化:(MSRA)sqrt(2/n)

1).
learning rate: 0.001
這裏寫圖片描述
最後一輪訓練數據:
Validation: 0.63
Test: 0.625
Loss: 0.000547
訓練時間: 3895.7s

2).
learning rate: 0.001 -> 0.0001

這裏寫圖片描述
第一圖縱座標是錯誤率
3)
learning_rate初始化爲0.001,然後採用指數衰減模式,在第60個迭代時,降低到0.0001。之後在多訓練20個迭代。(本次比上兩次多訓練20個迭代)

第60輪迭代數據:
validation: 0.619800
test: 0.604200
loss: 0.001159

對比一下在60迭代,learning固定爲0.001和用指數衰減(實驗1-1,1-3)的測試集精確度變化圖:
這裏寫圖片描述

80輪迭代數據:
Validation: 0.623600
test: 0.609900
loss: 0.000418
總訓練時間:5593.91s
這裏寫圖片描述

實驗二:
(1)數據集增強
將image set減去訓練集均值後,隨機裁剪爲24*24,然後隨機翻轉,隨機調整對比度,亮度。
學習率初始化爲0.01, 按照0.9995指數衰減。
訓練次數改爲 80 epochs
其餘參數和之前實驗一樣

這裏寫圖片描述
可以看到驗證集準確率已經突破80%了

實驗三:
(1)更換優化器
原:GradientDescentOptimizer
新:AdamOptimizer
這裏寫圖片描述
最終測試集準確率爲 0.79347

實驗四:
(1) 去掉LRN
優化器:GradientDescentOptimizer
這裏寫圖片描述
測試集精度: 0.811599
運行時間:3010s

(2)前兩層加上LRN
測試集精度:0.806290
運行時間4225s

與之前實驗對比:
這裏寫圖片描述
LRN對於精度影響不大,從單次實驗看,不帶LRN精度反而更好。從時間來看,LRN計算量很大,以至於運算時間明顯增長。在之後的paper中,幾乎沒見過人有用LRN的。更不用說BN提出後。再之後實驗中,去掉LRN。

實驗五:
與實驗四相比,除了Dropout參數改變外,其餘不變。
Dropout: 0.9 -> 0.5
這裏寫圖片描述
測試集精度:0.78526

按照paper中描述,dropout 0.5會增加一倍的收斂時間。因此將迭代次數增加一倍,看看效果。
這裏寫圖片描述
測試集精度:0.769331

實驗六:
使用global average pooling代替fc
忘記截圖了,去掉fc1,fc2.用global average pooling 替換。精度是0.75,少了2層fc,計算速度非常快,也許是目前用的姿勢不對,按照paper說,精度應該不受影響,如果我加上2層fc,會遇到梯度彌散,網絡不收斂的問題。

實驗七:
添加bn
這裏寫圖片描述
感覺侮辱了BN。。。。應該是工程實現上有問題。之後弄明白會來重補這次實驗。

總結:
說是Alexnet訓練cifar10,但是還是情不自禁嘗試了一些後續paper的技術。實驗中並沒有用到alex的overlapping pooling。

  • LRN沒有什麼卵用,反而增大了計算量。去掉2層lrn,訓練時間顯著減少三分之一。
  • 在沒有用數據集增強時,精度一直在65左右。用了之後,精度顯著的飛躍,到達80.說明數據集對於網絡精度至關重要。
  • 學習率控制非常重要,如果過大,訓練結果可能會非常糟糕,過小的話容易進入局部最小。總結一下衆多paper中訓練方法,初始0.01開始訓練,validation acc不變時,除以10,一直到0.00001停止。
  • 權值初始化,何凱明在MSRA提出來一種初始化方法,可能因爲cifar10維度太小,並沒有感到什麼優點。但是何凱明在Resnet中提到使用自己的方法,還是有用的。在使用BN之後,權值初始化就不是那麼的重要了。
  • 深度調參,隨意更改每一層卷積核,明顯的遇到了梯度彌散問題,非常尷尬。同時感到VGG中使用的pre-training的重要性。在resnet中和InceptionV3兩篇論文中給出了一些非常不錯的設計準則,可以參考調優網絡。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章