深度学习技巧与窍门
摘要:?本文是根據(jù)自身構(gòu)建深度學(xué)習(xí)模型總結(jié)而來(lái),適合有一定深度學(xué)習(xí)基礎(chǔ)的讀者閱讀。
? ? ? ?本文是根據(jù)自身構(gòu)建深度學(xué)習(xí)模型總結(jié)而來(lái),可能讀起來(lái)比較干巴,但干貨確實(shí)不少。閑話少敘,直接進(jìn)入相關(guān)內(nèi)容。
首先,為什么只是微調(diào)模型?
? ? ? ?類似于卷積神經(jīng)網(wǎng)絡(luò)(CNN)的深度學(xué)習(xí)模型一般而言都有大量的參數(shù),我們訓(xùn)練構(gòu)建的模型實(shí)際上就是為了得到比較好的網(wǎng)絡(luò)參數(shù)值,整個(gè)調(diào)參過(guò)程需要花費(fèi)大量的硬件和時(shí)間資源。因此,很多研究者在改進(jìn)模型時(shí)采用的方法是在專家設(shè)計(jì)和構(gòu)建的模型基礎(chǔ)上進(jìn)行深入研究,一般情況下,專家會(huì)開源構(gòu)建的模型結(jié)構(gòu)和原理,有些會(huì)給出相應(yīng)訓(xùn)練好的模型參數(shù),可供其它研究人員直接使用,比如遷移學(xué)習(xí)等。
深度學(xué)習(xí)技巧
? ? ? ?可以通過(guò)以下幾種方法來(lái)改善訓(xùn)練模型的擬合時(shí)間和準(zhǔn)確性:
- 1.研究理想的預(yù)訓(xùn)練結(jié)構(gòu):了解遷移學(xué)習(xí)的好處,或?yàn)g覽一些高效CNN模型結(jié)構(gòu)。此外,可以考慮其它看起來(lái)不太明顯的領(lǐng)域,共享潛在的相似特征。
- 2.使用一個(gè)小的學(xué)習(xí)率:由于預(yù)先訓(xùn)練的權(quán)重通常比隨機(jī)初始化的權(quán)重要好,所以修改參數(shù)時(shí)應(yīng)該更細(xì)致些!參數(shù)的選擇取決于學(xué)習(xí)環(huán)境和預(yù)訓(xùn)練的效果,但需要檢查各個(gè)Epoch的錯(cuò)誤以清楚收斂過(guò)程。
- 3.使用dropout:與用于回歸模型的Ridge和LASSO正則化一樣,所有模型都沒(méi)有優(yōu)化的alpha或dropout。dropout是一個(gè)超參數(shù),表明每次訓(xùn)練時(shí)丟棄的神經(jīng)元概率,其設(shè)置取決于具體問(wèn)題,并且必須經(jīng)過(guò)實(shí)驗(yàn)測(cè)試。一般開始時(shí)設(shè)置得比較大,隨后跨數(shù)量級(jí)的形式搜索其最優(yōu)設(shè)置值。
- 4.限制權(quán)重大小:可以限制某些層權(quán)重的最大范數(shù)(絕對(duì)值)以使得模型更加泛化。
- 5.不要修改第一層:神經(jīng)網(wǎng)絡(luò)的第一個(gè)隱藏層傾向于捕捉通用和可解釋的特征,例如形狀、曲線等。因此,在應(yīng)用遷移學(xué)習(xí)時(shí),一般不會(huì)對(duì)經(jīng)典模型的第一層進(jìn)行修改,并且專注于優(yōu)化其它層或添加隱藏層。
- 6.修改輸出層:將模型默認(rèn)值替換為適合的新激活函數(shù)和輸出大小。但是,不要將自己局限于最明顯的解決方案,即只改變激活函數(shù)和最后輸出層的節(jié)點(diǎn)數(shù)。雖然MNIST數(shù)據(jù)集可能看起來(lái)像是需要10個(gè)輸出類別,但一些數(shù)字有共同的變化,相關(guān)結(jié)果表明輸出層設(shè)置為輸出12-16個(gè)類別可以更好地解決這些變體并提高模型性能!
Keras中的技巧
? ? ? ?以下是如何修改dropout和限制MNIST數(shù)據(jù)集的權(quán)重大小:
# dropout in input and hidden layers # weight constraint imposed on hidden layers # ensures the max norm of the weights does not exceed 5 model = Sequential() model.add(Dropout(0.2, input_shape=(784,))) # dropout on the inputs # this helps mimic noise or missing data model.add(Dense(128, input_dim=784, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(5))) model.add(Dropout(0.5)) model.add(Dense(128, kernel_initializer='normal', activation='tanh', kernel_constraint=maxnorm(5))) model.add(Dropout(0.5)) model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))Dropout最佳實(shí)踐:
- 使用小的dropout概率,一般為20%~50%,對(duì)于輸入建議使用20%。概率太低會(huì)導(dǎo)致收獲甚微,太高導(dǎo)致訓(xùn)練不好;
- 在輸入層和隱藏層上都使用dropout,這已被證明可以提高深度學(xué)習(xí)模型的性能;
- 使用衰減大的學(xué)習(xí)速率和大的動(dòng)量;
- 限制權(quán)重,大的學(xué)習(xí)速率可能導(dǎo)致梯度爆炸,相關(guān)論文表明,對(duì)網(wǎng)絡(luò)權(quán)重施加約束可以改善結(jié)果。
- 使用大型網(wǎng)絡(luò)。在較大的網(wǎng)絡(luò)中使用dropout可能會(huì)獲得更好的性能,從而使模型更有機(jī)會(huì)學(xué)習(xí)獨(dú)立表示。
? ? ? ?下面是Keras中修改最后一層的例子,將MNIST的10類修改為14類:
? ? ? ?以及如何凍結(jié)前五層權(quán)重的示例:
for layer in model.layers[:5]:layer.trainable = False? ? ? ?或者,可以將該層的學(xué)習(xí)率設(shè)置為零,然后使用像Adadelta或Adam這樣的參數(shù)自適應(yīng)學(xué)習(xí)算法。
預(yù)訓(xùn)練網(wǎng)絡(luò)庫(kù)資源
Keras
- Kaggle List
- Kears Application
- OpenCV Example
TensorFlow
- VGG16
- Inception V3
- ResNet
Torch
- LoadCaffe
Caffe
- Model Zoo
在Jupyter中查看TensorBoard圖
? ? ? ?了解模型的外觀通常是很重要的。如果使用的是Keras工具,搭建出來(lái)的模型會(huì)很抽象,并且不允許深入分析模型的各個(gè)部分。幸運(yùn)的是,下面的代碼可以直接用Python直觀地看到構(gòu)建的模型(代碼太長(zhǎng),見原文):
from IPython.display import clear_output, Image, display, HTML def strip_consts(graph_def, max_const_size=32):"""Strip large constant values from graph_def."""strip_def = tf.GraphDef()for n0 in graph_def.node:n = strip_def.node.add() n.MergeFrom(n0)if n.op == 'Const':tensor = n.attr['value'].tensorsize = len(tensor.tensor_content)if size > max_const_size:tensor.tensor_content = bytes("<stripped %d bytes>"%size, 'utf-8')return strip_def ..用Keras可視化模型
? ? ? ?以下代碼將繪制模型的圖形并將其保存為png文件:
from keras.utils.visualize_util import plot plot(model, to_file='model.png')? ? ? ?plot有兩個(gè)參數(shù)可供選擇:
- show_shapes(默認(rèn)為False)控制輸出形狀是否顯示在圖形中;
- show_layer_names(默認(rèn)為True)控制圖層中是否顯示圖層名稱;
? ? ? ?也可以直接獲取pydot.Graph對(duì)象并自己渲染它,例如在ipython notebook中顯示它:
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
- 上一篇: 开启数据科学职业生涯的8个基本技巧
- 下一篇: 恭喜你!在25岁前看到了这篇最最靠谱的深