深度学习技巧与窍门
摘要:?本文是根據自身構建深度學習模型總結而來,適合有一定深度學習基礎的讀者閱讀。
? ? ? ?本文是根據自身構建深度學習模型總結而來,可能讀起來比較干巴,但干貨確實不少。閑話少敘,直接進入相關內容。
首先,為什么只是微調模型?
? ? ? ?類似于卷積神經網絡(CNN)的深度學習模型一般而言都有大量的參數,我們訓練構建的模型實際上就是為了得到比較好的網絡參數值,整個調參過程需要花費大量的硬件和時間資源。因此,很多研究者在改進模型時采用的方法是在專家設計和構建的模型基礎上進行深入研究,一般情況下,專家會開源構建的模型結構和原理,有些會給出相應訓練好的模型參數,可供其它研究人員直接使用,比如遷移學習等。
深度學習技巧
? ? ? ?可以通過以下幾種方法來改善訓練模型的擬合時間和準確性:
- 1.研究理想的預訓練結構:了解遷移學習的好處,或瀏覽一些高效CNN模型結構。此外,可以考慮其它看起來不太明顯的領域,共享潛在的相似特征。
- 2.使用一個小的學習率:由于預先訓練的權重通常比隨機初始化的權重要好,所以修改參數時應該更細致些!參數的選擇取決于學習環境和預訓練的效果,但需要檢查各個Epoch的錯誤以清楚收斂過程。
- 3.使用dropout:與用于回歸模型的Ridge和LASSO正則化一樣,所有模型都沒有優化的alpha或dropout。dropout是一個超參數,表明每次訓練時丟棄的神經元概率,其設置取決于具體問題,并且必須經過實驗測試。一般開始時設置得比較大,隨后跨數量級的形式搜索其最優設置值。
- 4.限制權重大小:可以限制某些層權重的最大范數(絕對值)以使得模型更加泛化。
- 5.不要修改第一層:神經網絡的第一個隱藏層傾向于捕捉通用和可解釋的特征,例如形狀、曲線等。因此,在應用遷移學習時,一般不會對經典模型的第一層進行修改,并且專注于優化其它層或添加隱藏層。
- 6.修改輸出層:將模型默認值替換為適合的新激活函數和輸出大小。但是,不要將自己局限于最明顯的解決方案,即只改變激活函數和最后輸出層的節點數。雖然MNIST數據集可能看起來像是需要10個輸出類別,但一些數字有共同的變化,相關結果表明輸出層設置為輸出12-16個類別可以更好地解決這些變體并提高模型性能!
Keras中的技巧
? ? ? ?以下是如何修改dropout和限制MNIST數據集的權重大小:
# 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最佳實踐:
- 使用小的dropout概率,一般為20%~50%,對于輸入建議使用20%。概率太低會導致收獲甚微,太高導致訓練不好;
- 在輸入層和隱藏層上都使用dropout,這已被證明可以提高深度學習模型的性能;
- 使用衰減大的學習速率和大的動量;
- 限制權重,大的學習速率可能導致梯度爆炸,相關論文表明,對網絡權重施加約束可以改善結果。
- 使用大型網絡。在較大的網絡中使用dropout可能會獲得更好的性能,從而使模型更有機會學習獨立表示。
? ? ? ?下面是Keras中修改最后一層的例子,將MNIST的10類修改為14類:
? ? ? ?以及如何凍結前五層權重的示例:
for layer in model.layers[:5]:layer.trainable = False? ? ? ?或者,可以將該層的學習率設置為零,然后使用像Adadelta或Adam這樣的參數自適應學習算法。
預訓練網絡庫資源
Keras
- Kaggle List
- Kears Application
- OpenCV Example
TensorFlow
- VGG16
- Inception V3
- ResNet
Torch
- LoadCaffe
Caffe
- Model Zoo
在Jupyter中查看TensorBoard圖
? ? ? ?了解模型的外觀通常是很重要的。如果使用的是Keras工具,搭建出來的模型會很抽象,并且不允許深入分析模型的各個部分。幸運的是,下面的代碼可以直接用Python直觀地看到構建的模型(代碼太長,見原文):
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有兩個參數可供選擇:
- show_shapes(默認為False)控制輸出形狀是否顯示在圖形中;
- show_layer_names(默認為True)控制圖層中是否顯示圖層名稱;
? ? ? ?也可以直接獲取pydot.Graph對象并自己渲染它,例如在ipython notebook中顯示它:
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
- 上一篇: 开启数据科学职业生涯的8个基本技巧
- 下一篇: 一张图看懂阿里企业级分布式应用服务EDA