之前在自學神經網路的時候,一般都是呼叫當前主流的框架,例如keras、tensorflow等等。不得不說keras是乙個極其簡單的框架,在它的中文文件可以輕鬆找到關於dropout的呼叫方法。然而最近由於學習的需要,網路是自己手動搭建的,又在訓練中遇到了過擬合的情況,於是需要自己在網路中手動加入dropout。
關於dropout的原理,這裡推薦一篇介紹的極為詳細的知乎文章,若是不想去看長篇文字,這裡我用一句話概括,就是通過隨機遮蔽網路中的一部分神經元,達到網路始終在變化的效果,這樣每輪都在訓練不同的網路,從而使它們達到相互制衡的目的。
本**的基本思路是:我們的權重矩陣可以看成是乙個從輸入層到隱層的突觸連線集合。假設我們的權重矩陣是乙個有j
jj行i
ii列的矩陣,代表有j
jj個輸入神經元和i
ii個隱層的神經元。若需要遮蔽第i
ii個隱層神經元時,只需要將權重矩陣的第i
ii列置0即可。這樣輸入的資料全部進入該神經元時都會變為0,這個神經元輸出的資料也是0,可以想象成這個神經元不存在。
每次遮蔽固定數量的神經元
def
dropout0
(x, droprate=
0.2)
:# x是複製的權重矩陣
num = droprate * x.shape[1]
# 計算在隱層要丟棄的神經元數
for i in
range
(int
(num)):
col = np.random.randint(
1, x.shape[1]
)#選取要遮蔽的列值
x[:, col]=0
.# 將該列置0
return x
以上的方法可以在每次遮蔽固定數量的神經元,雖然在實際操作中夠用,但是該方式在公式推導中是不嚴謹的,我們需要按照概率p
pp產生要遮蔽的神經元數量,而不是乙個固定值。
按照伯努利分布來遮蔽神經元
此**使用了伯努利分布來生成未遮蔽的神經元索引,dropout是要遮蔽的比例,retain是要保留的比例。
def
dropout1
(x, droprate=
0.2)
:# x是複製的權重矩陣
retain =
1- droprate # 計算得要保留的神經元數量
random_tensor = np.random.binomial(n=
1, p=retain, size=x.shape[1]
)# 一維的陣列,按照概率為p的伯努利分布生成1,其餘是0
for i in
range
(x.shape[1]
):if(random_tensor[i]==0
):x[
:, i]=0
# 索引對應一維陣列索引為0的列置0
return x
伯努利分布,不使用迴圈的版本
眾所周知能用矩陣乘法就不用迴圈,為了**效率,看迴圈賊不順眼的本人又寫了乙個不用迴圈的版本。然而實測這個是最慢的emmm…
def
dropout2
(x, droprate=
0.2)
: retain =
1- droprate
random_array = np.random.binomial(n=
1, p=retain, size=x.shape[1]
) random_tensor = np.tile(random_array,
(x.shape[0]
,1))
x = x * random_tensor
return x
最後來一段**來測一下效率:
矩陣有2304
2304
2304
行,有150
15015
0列,迴圈12000次,前兩種方法基本是兩分鐘左右,第三種是兩分半鐘左右(i5-8265u)
for i in tqdm(
range
(12000))
: weight_h = np.random.randn(16*
12*12,
150)
w_h = np.array(weight_h)
w_h = dropout1(w_h,
0.2)
切記使用函式時,使用矩陣的副本,不要使用原矩陣來輸入函式,否則會在原矩陣上做出改變。
為了使矩陣遮蔽前後的期望保持一致,在**時要先將權重矩陣縮小,比如丟棄比例為p
pp,則**時要先將矩陣乘以(1−
p)
(1-p)
(1−p)。
為了使網路加速收斂,函式可以靈活使用,根據訓練集準確率靈活調整droprate。
Python神經網路搭建(1)
1 首先匯入numpy庫和scipy庫 scipy.special裡呼叫自啟用函式 import numpy import scipy.special2 初始化網路 設定輸入層節點 隱藏層節點和輸出層節點的數量及學習率 利用lambda建立匿名函式 class neuralnetwork def i...
搭建神經網路
1.import 2.train,test 3.model tf.keras.model.sequential 在sequential中描述網路結構,相當於走一遍前向傳播 4.model.compile 在compile中配置訓練方法,選擇哪個優化器,選擇什麼損失函式,選擇什麼評價指標 5.mode...
神經網路 python實現神經網路
神經網路系列目錄 神經網路 神經網路原理介紹 bp演算法 神經網路 sklearn引數介紹及應用 神經網路實戰 主播綜合評分回歸 實戰 最小二乘法 梯度下降法區別及python實現 本篇博文通過python 實現神經網路,採用sklearn自帶的手寫數字集,看分類情況如何 一 匯入資料集並標準化 資...