深度學習技巧與竅門
來自專欄我是程序員
摘要:本文是根據自身構建深度學習模型總結而來,適合有一定深度學習基礎的讀者閱讀。
本文是根據自身構建深度學習模型總結而來,可能讀起來比較乾巴,但乾貨確實不少。閑話少敘,直接進入相關內容。
首先,為什麼只是微調模型?
類似於卷積神經網路(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 5model = Sequential()model.add(Dropout(0.2, input_shape=(784,))) # dropout on the inputs# this helps mimic noise or missing datamodel.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類:
from keras.layers.core import Activation, Densemodel.layers.pop() # defaults to lastmodel.outputs = [model.layers[-1].output]model.layers[-1].outbound_nodes = []model.add(Dense(14, activation=softmax))
以及如何凍結前五層權重的示例:
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, HTMLdef 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].tensor size = 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 plotplot(model, to_file=model.png)
plot有兩個參數可供選擇:
- show_shapes(默認為False)控制輸出形狀是否顯示在圖形中;
- show_layer_names(默認為True)控制圖層中是否顯示圖層名稱;
也可以直接獲取pydot.Graph對象並自己渲染它,例如在ipython notebook中顯示它:
from IPython.display import SVGfrom keras.utils.visualize_util import model_to_dotSVG(model_to_dot(model).create(prog=dot, format=svg))
以上即為個人的全部建模經驗,讀者如果有不同意見或有其它優方法的話可以留言探討。
數十款阿里雲產品限時折扣中,趕緊點擊領劵開始雲上實踐吧!
以上為譯文,由阿里云云棲社區組織翻譯。譯文鏈接
文章原標題《Deep Learning Tips and Tricks》譯者:海棠,審校:Uncle_LLD。
文章為簡譯,更為詳細的內容,請查看原文。更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
本文為雲棲社區原創內容,未經允許不得轉載。
推薦閱讀:
※日常避免傷腰的小竅門
※《梅花易數》斷占竅門:「為何從克中取應期」
※教你幾招皮鞋處理的小竅門
※降低血糖有竅門 糖友不要急
※剝蛋皮小竅門