當進行模型訓練的時候,往往可能錯過模型的最佳臨界點,即當達到最大精度的時候再進行訓練,測試集的精度會下降,這時候就會出現過擬合,如果能在其臨界點處提前終止訓練,就能得到表達力較強的模型,從而也避免了過擬合,這種方法就叫early stopping,但是這種方法多依靠人的經驗和感覺去判斷,因為無法准確的預測后面還有沒有最佳臨界值,所以這種方法更適合老道的深度學習人員,而對於初學者或者說直覺沒有那么准的人,則有一種更簡便的方法——dropout,它的大致意思是在訓練時,將神經網絡某一層的單元(不包括輸出層的單元)數據隨機丟失一部分。
具體而言,使用dropout集成方法需要訓練的是從原始網絡去掉一些不屬於輸出層的單元后形成的子網絡,如圖:
可以將每次的單元丟棄都理解為是對特征的一種再采樣,這種做法實際上是等於創造出了很多新的隨機樣本,以增大樣本量,減少特征量的方法來防止過擬合。
在使用復雜的卷積神經網絡訓練大型的圖像識別神經網絡模型時使用dropout方法會得到顯著的效果,我們可以把dropout的過程想象成隨機將一張圖片(或某個網絡層)中一定比例的數據刪除調(即這部分數據都變為0,在圖像中0代表黑色),這樣就模擬了將圖像中某些位置塗成黑色,此時人眼很有可能辨認出這張圖片的內容,當然,模型也可以用其進行訓練。
tensorflow中提供了很簡單的使用方法:
network = keras.Sequential([ keras.layers.Dense(256,activation='relu'), keras.layers.Dropout(0.5), keras.layers.Dense(128,activation='relu'), keras.layers.Dropout(0.5), keras.layers.Dense(64,activation='relu'), keras.layers.Dense(32,activation='relu'), keras.layers.Dense(10) ])
在使用dropout之后,在前向傳播時必須聲明training參數,因為模型的train和test的策略是不一樣的,所以需要人為的做區分,區分方法就是給定training參數的值(True或False),以此來指定當前狀態。
代碼如下:
for step,(x,y) in enumerate(db_train): # train with tf.GradientTape() as tape: x = tf.reshape(x,(-1,28*28)) out = network(x,training=True) # …… # test out = network(x,training=False)