Dropout解決過擬合代碼

學習自《深度學習入門》

過擬合指的是隻能擬合訓練數據,但不能很好地擬合不包含在訓練數據中的其他數據的狀態。

發生過擬合的原因,主要有以下兩個。

  • 模型擁有大量參數、表現力強。
  • 訓練數據少

權值衰減是一直以來經常被使用的一種抑制過擬合的方法,。該方法可以簡單地實現,在某種程度上能夠抑制過擬合。但是,如果網絡的模型變得很複雜,只用權值衰減就難以應對了。在這種情況下,我們經常會使用Dropout 方法

Dropout是一種在學習的過程中隨機刪除神經元的方法

訓練時,每傳遞一次數據,隨機選出隱藏層的神經元,然後將其刪除。被刪除的神經元不再進行信號的傳遞
測試時,雖然會傳遞所有的神經元信號,但是對於各個神經元的輸出,要乘上訓練時的刪除比例後再輸出
在這裏插入圖片描述

class Dropout:
 def __init__(self, dropout_ratio=0.5):
   self.dropout_ratio = dropout_ratio
   self.mask = None
 def forward(self, x, train_flg=True):
   if train_flg:
     self.mask = np.random.rand(*x.shape) > self.dropout_ratio
     return x * self.mask
   else:
     return x * (1.0 - self.dropout_ratio)
 def backward(self, dout):
    return dout * self.mask

這裏的要點是,每次正向傳播時,self.mask中都會以False的形式保存要刪除的神經元。self.mask會隨機生成和x形狀相同的數組,並將值比dropout_ratio大的元素設爲True。反向傳播時的行爲和ReLU相同。也就是說,正向傳播時傳遞了信號的神經元,反向傳播時按原樣傳遞信號;正向傳播時沒有傳遞信號的神經元,反向傳播時信號將停在那


代碼解釋

a=[[1,2,3],
   [4,5,6]]
dropout_ratio=0.5
print(np.random.rand(*np.array(a).shape))
mask=np.random.rand(*np.array(a).shape)>0.5
print(mask)

>>>
[[0.03797064 0.24113302 0.23486832]
 [0.67104404 0.63273187 0.81895389]]
[[ True False False]
 [False  True  True]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章