【调参实战】BN和Dropout对小模型有什么影响?全局池化相比全连接有什么劣势?...
大家好,歡迎來(lái)到專(zhuān)欄《調(diào)參實(shí)戰(zhàn)》,雖然當(dāng)前自動(dòng)化調(diào)參研究越來(lái)越火,但那其實(shí)只是換了一些參數(shù)來(lái)調(diào),對(duì)參數(shù)的理解和調(diào)試在機(jī)器學(xué)習(xí)相關(guān)任務(wù)中是最基本的素質(zhì),在這個(gè)專(zhuān)欄中我們會(huì)帶領(lǐng)大家一步一步理解和學(xué)習(xí)調(diào)參。
本次主要講述圖像分類(lèi)項(xiàng)目中的BN層和Drouout層的調(diào)參對(duì)比實(shí)踐,以及全連接層和池化層的對(duì)比實(shí)踐。
作者&編輯 | 言有三
本文資源與結(jié)果展示
本文篇幅:3000字
背景要求:會(huì)使用Python和任一深度學(xué)習(xí)開(kāi)源框架
附帶資料:Caffe代碼和數(shù)據(jù)集一份
同步平臺(tái):有三AI知識(shí)星球(一周內(nèi))
1 項(xiàng)目背景與準(zhǔn)備工作
在卷積神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)中,早期出現(xiàn)的Dropout層可以降低模型過(guò)擬合的風(fēng)險(xiǎn),增強(qiáng)模型的泛化性能。而隨著B(niǎo)atch Normalization層的出現(xiàn),Dropout逐漸被代替,Batch Normalization層不僅可以加速模型的訓(xùn)練,還在一定程度上緩解了模擬的過(guò)擬合風(fēng)險(xiǎn)。
與之類(lèi)似,全連接層和全局池化層也是一對(duì)冤家,最早期的時(shí)候,對(duì)于分類(lèi)任務(wù)來(lái)說(shuō)網(wǎng)絡(luò)最后層都是全連接層,但是因?yàn)樗膮?shù)量巨大,導(dǎo)致后來(lái)被全局池化層替代,那替換就一定是帶來(lái)正向的結(jié)果嗎?會(huì)不會(huì)有什么副作用?
這一期我們來(lái)對(duì)以上問(wèn)題進(jìn)行實(shí)踐,本次項(xiàng)目開(kāi)發(fā)需要以下環(huán)境:
(1) Linux系統(tǒng),推薦ubuntu16.04或者ubuntu18.04。使用windows系統(tǒng)也可以完成,但是使用Linux效率更高。
(2) 最好擁有一塊顯存不低于6G的GPU顯卡,如果沒(méi)有使用CPU進(jìn)行訓(xùn)練速度較慢。
(3)?安裝好的Caffe開(kāi)源框架。
2 Dropout和BN層實(shí)踐
下面我們首先對(duì)Dropout和BN層進(jìn)行實(shí)踐,如果對(duì)這兩者的理解不熟悉的,請(qǐng)查看往期文章:
【AI初識(shí)境】深度學(xué)習(xí)模型中的Normalization,你懂了多少?
【AI初識(shí)境】被Hinton,DeepMind和斯坦福嫌棄的池化,到底是什么?
本次的數(shù)據(jù)集和基準(zhǔn)模型與上一期內(nèi)容相同,大家如果不熟悉就去查看上一期的內(nèi)容,鏈接如下:
【調(diào)參實(shí)戰(zhàn)】如何開(kāi)始你的第一個(gè)深度學(xué)習(xí)調(diào)參任務(wù)?不妨從圖像分類(lèi)中的學(xué)習(xí)率入手。
【調(diào)參實(shí)戰(zhàn)】那些優(yōu)化方法的性能究竟如何,各自的參數(shù)應(yīng)該如何選擇?
2.1 Dropout層
首先我們給基準(zhǔn)模型添加Dropout層,它通常是被添加在網(wǎng)絡(luò)靠后的位置,我們將其添加到conv5層后面,得到的模型結(jié)構(gòu)如下:
完整的結(jié)構(gòu)配置如下:
layer {
? ?name: "data"
? ?type: "ImageData"
? ?top: "data"
? ?top: "label"
? ?include {
? ? ?phase: TRAIN
? ?}
? ?transform_param {
? ? ?mirror: true
? ? ?crop_size: 224
? ? ?mean_value: 104.0
? ? ?mean_value: 117.0
? ? ?mean_value: 124.0
? ?}
? ?image_data_param {
? ? ?source: "list_train_shuffle.txt"
? ? ?batch_size: 64
? ? ?shuffle: true
? ? ?new_height: 256
? ? ?new_width: 256
? ?}
?}
layer {
? ?name: "data"
? ?type: "ImageData"
? ?top: "data"
? ?top: "label"
? ?include {
? ? ?phase: TEST
? ?}
? ?transform_param {
? ? ?mirror: false
? ? ?crop_size: 224
? ? ?mean_value: 104.0
? ? ?mean_value: 117.0
? ? ?mean_value: 124.0
? ?}
? ?image_data_param {
? ? ?source: "list_val_shuffle.txt"
? ? ?batch_size: 64
? ? ?shuffle: false
? ? ?new_height: 224
? ? ?new_width: 224
? ?}
?}
layer {
? bottom: "data"
? top: "conv1"
? name: "conv1"
? type: "Convolution"
? param {
? ? lr_mult: 1
? ? decay_mult: 1
? }
? param {
? ? lr_mult: 2
? ? decay_mult: 0
? }
? convolution_param {
? ? num_output: 64
? ? pad: 1
? ? kernel_size: 3? ??
? ? stride: 2
? ? weight_filler {
? ? ? type: "gaussian"
? ? ? std: 0.01
? ? }
? ? bias_filler {
? ? ? type: "constant"
? ? ? value: 0
? ? }
? }
}
layer {
? bottom: "conv1"
? top: "conv1"
? name: "relu1"
? type: "ReLU"
}
layer {
? bottom: "conv1"
? top: "conv2"
? name: "conv2"
? type: "Convolution"
? param {
? ? lr_mult: 1
? ? decay_mult: 1
? }
? param {
? ? lr_mult: 2
? ? decay_mult: 0
? }
? convolution_param {
? ? num_output: 64
? ? pad: 1
? ? kernel_size: 3
? ? stride: 2
? ? weight_filler {
? ? ? type: "gaussian"
? ? ? std: 0.01
? ? }
? ? bias_filler {
? ? ? type: "constant"
? ? ? value: 0
? ? }
? }
}
layer {
? bottom: "conv2"
? top: "conv2"
? name: "relu2"
? type: "ReLU"
}
layer {
? bottom: "conv2"
? top: "conv3"
? name: "conv3"
? type: "Convolution"
? param {
? ? lr_mult: 1
? ? decay_mult: 1
? }
? param {
? ? lr_mult: 2
? ? decay_mult: 0
? }
? convolution_param {
? ? num_output: 128
? ? pad: 1
? ? kernel_size: 3
? ? stride: 2
? ? weight_filler {
? ? ? type: "gaussian"
? ? ? std: 0.01
? ? }
? ? bias_filler {
? ? ? type: "constant"
? ? ? value: 0
? ? }
? }
}
layer {
? bottom: "conv3"
? top: "conv3"
? name: "relu3"
? type: "ReLU"
}
layer {
? bottom: "conv3"
? top: "conv4"
? name: "conv4"
? type: "Convolution"
? param {
? ? lr_mult: 1
? ? decay_mult: 1
? }
? param {
? ? lr_mult: 2
? ? decay_mult: 0
? }
? convolution_param {
? ? num_output: 128
? ? pad: 1
? ? stride: 2
? ? kernel_size: 3
? ? weight_filler {
? ? ? type: "gaussian"
? ? ? std: 0.01
? ? }
? ? bias_filler {
? ? ? type: "constant"
? ? ? value: 0
? ? }
? }
}
layer {
? bottom: "conv4"
? top: "conv4"
? name: "relu4"
? type: "ReLU"
}
layer {
? bottom: "conv4"
? top: "conv5"
? name: "conv5"
? type: "Convolution"
? param {
? ? lr_mult: 1
? ? decay_mult: 1
? }
? param {
? ? lr_mult: 2
? ? decay_mult: 0
? }
? convolution_param {
? ? num_output: 256
? ? pad: 1
? ? stride: 2
? ? kernel_size: 3
? ? weight_filler {
? ? ? type: "gaussian"
? ? ? std: 0.01
? ? }
? ? bias_filler {
? ? ? type: "constant"
? ? ? value: 0
? ? }
? }
}
layer {
? bottom: "conv5"
? top: "conv5"
? name: "relu5"
? type: "ReLU"
}
layer {
? name: "drop"
? type: "Dropout"
? bottom: "conv5"
? top: "conv5"
? dropout_param {
? ? dropout_ratio: 0.5
? }
}
layer {
? ? bottom: "conv5"
? ? top: "pool5"
? ? name: "pool5"
? ? type: "Pooling"
? ? pooling_param {
? ? ? ? kernel_size: 7
? ? ? ? stride: 1
? ? ? ? pool: AVE
? ? }
}
layer {
? bottom: "pool5"
? top: "fc"
? name: "fc"
? type: "InnerProduct"
? ? inner_product_param {
? ? ? ? num_output: 20
? ? ? ? weight_filler {
? ? ? ? ? ? type: "xavier"
? ? ? ? }
? ? ? ? bias_filler {
? ? ? ? ? ? type: "constant"
? ? ? ? ? ? value: 0
? ? ? ? }
? ? }
}
layer {
? name: "accuracy_at_1"
? type: "Accuracy"
? bottom: "fc"
? bottom: "label"
? top: "accuracy_at_1"
? accuracy_param {
? ? top_k: 1
? }
}
layer {
? name: "accuracy_at_5"
? type: "Accuracy"
? bottom: "fc"
? bottom: "label"
? top: "accuracy_at_5"
? accuracy_param {
? ? top_k: 5
? }
}
layer {
? bottom: "fc"
? bottom: "label"
? top: "loss"
? name: "loss"
? type: "SoftmaxWithLoss"
}
我們?cè)囼?yàn)了兩個(gè)不同比率,即Dropout=0.5和Dropout=0.9,優(yōu)化參數(shù)配置如下:
net: "allconv6.prototxt"
test_interval:100
test_iter:15
base_lr: 0.01
lr_policy: "step"
stepsize: 10000
gamma: 0.1
momentum: 0.9
weight_decay: 0.005
display: 100
max_iter: 100000
snapshot: 10000
snapshot_prefix: "models/allconv6_"
solver_mode: GPU
其與基準(zhǔn)模型試驗(yàn)結(jié)果對(duì)比如下:
可以看出,添加Dropout之后,模型明顯要穩(wěn)定很多,但是其性能稍微有所下降,這是因?yàn)榛鶞?zhǔn)模型本身就比較小,Dropout會(huì)降低模型的容量。Dropout=0.5和Dropout=0.9時(shí)性能差不多,這都是比較常用的配置,更小的比率預(yù)期會(huì)進(jìn)一步降低模型的性能,大家可以進(jìn)行嘗試。
2.2 BN層
總結(jié)
以上是生活随笔為你收集整理的【调参实战】BN和Dropout对小模型有什么影响?全局池化相比全连接有什么劣势?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【通知】有三AI运营组成员招收条件及管理
- 下一篇: 【总结】有三AI秋季划图像质量组3月直播