inverted_dropout
生活随笔
收集整理的這篇文章主要介紹了
inverted_dropout
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在B站看沐神的動手學深度學習視頻,記錄一下學習過程
查看本文的jupyter notebook格式,更加清晰美觀哦!
丟棄法
除了權重衰減以外,深度學習常常使用丟棄法(dropout)來應對過擬合問題。丟棄法有一些不同的變體。本文中提到的丟棄法特指倒置丟棄法(inverted dropout)
當對隱藏層使用丟棄法時,隱藏單元將有一定的概率被丟棄。設丟棄概率為p,丟棄概率是丟棄法的超參數。具體來說,設隨機變量,εi為0或1的概率分別為p和1-p。使用丟棄法時,重新計算隱藏單元,hi’=εi*hi/(1-p)。由于E(εi)=1-p,因此E(hi’)=E(εi)*hi/(1-p)=hi。由此可知,丟棄法并不改變輸入值的期望。
由于在訓練中,隱藏層的神經元是隨機丟棄的,即每個神經元的輸出都可能被清零,輸出層的計算無法過度依賴任何一個神經元,從而在訓練模型時起到正則化的作用,并可以用來應對過擬合。在測試模型時,為了得到更加確定性的結果,一般不使用丟棄法。
%matplotlib inline import d2lzh as d2l from mxnet import gluon, nd, autograd, init from mxnet.gluon import loss as gloss, data as gdata, nn測試nd.random.uniform函數的作用
w = nd.random.uniform(0, 1, shape=(3,5)) w [[0.5488135 0.5928446 0.71518934 0.84426576 0.60276335][0.8579456 0.5448832 0.8472517 0.4236548 0.6235637 ][0.6458941 0.3843817 0.4375872 0.2975346 0.891773 ]] <NDArray 3x5 @cpu(0)> mask = w<0.6 mask [[1. 1. 0. 0. 0.][0. 1. 0. 1. 0.][0. 1. 1. 1. 0.]] <NDArray 3x5 @cpu(0)> mask*w [[0.5488135 0.5928446 0. 0. 0. ][0. 0.5448832 0. 0.4236548 0. ][0. 0.3843817 0.4375872 0.2975346 0. ]] <NDArray 3x5 @cpu(0)>從零開始實現
def dropout(X, drop_prob):"""以drop_prob的概率隨機丟棄NDArray類型的X中的元素"""assert 0<=drop_prob<=1keep_prob = 1-drop_prob# 這種情況下,把全部元素都丟棄if keep_prob==0:return X.zeros_like()mask = nd.random.uniform(0, 1, X.shape) < keep_probreturn mask*X / keep_prob運行幾個例子,測試dropout函數。其中丟棄概率分別為0, 0.5, 1
X = nd.arange(16).reshape(2,8) dropout(X, 0) [[ 0. 1. 2. 3. 4. 5. 6. 7.][ 8. 9. 10. 11. 12. 13. 14. 15.]] <NDArray 2x8 @cpu(0)> dropout(X, 0.5) [[ 0. 2. 4. 0. 0. 0. 12. 0.][ 0. 0. 20. 0. 0. 26. 0. 0.]] <NDArray 2x8 @cpu(0)> dropout(X, 1) [[0. 0. 0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 0. 0.]] <NDArray 2x8 @cpu(0)>定義模型參數。使用Fashion_MNIST數據集,定義兩層隱藏層的多層感知機,其中兩個隱藏層的單元個數都是256
num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256W1 = nd.random.normal(scale=0.01, shape=(num_inputs , num_hiddens1)) b1 = nd.zeros(shape=(num_hiddens1)) W2 = nd.random.normal(scale=0.01, shape=(num_hiddens1 , num_hiddens2)) b2 = nd.zeros(shape=(num_hiddens2)) W3 = nd.random.normal(scale=0.01, shape=(num_hiddens2 , num_outputs)) b3 = nd.zeros(shape=(num_outputs))params = [W1, b1, W2, b2, W3, b3] for param in params:param.attach_grad()定義模型。通常的建議是靠近輸入層的丟棄概率設置的小一點。在這個實驗中,把第一個隱藏層的丟棄概率設置為0.2, 第二個隱藏層的丟棄概率設置為0.5。通過is_training函數判斷運行模式為訓練還是測試,并只需要在訓練模式下使用丟棄法。
drop_prob1, drop_prob2 = 0.2, 0.5 def net(X):X = X.reshape((-1, num_inputs))H1 = (nd.dot(X, W1)+b1).relu()if autograd.is_training():H1 = dropout(H1, drop_prob1)H2 = (nd.dot(H1, W2)+b2).relu()if autograd.is_training():H2 = dropout(H2, drop_prob2)return nd.dot(H2, W3)+b3訓練和測試模型
num_epochs, lr, batch_size = 5, 0.5, 256 loss = gloss.SoftmaxCrossEntropyLoss() train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params, lr) epoch 1, loss 1.1165, train acc 0.562, test acc 0.785 epoch 2, loss 0.5763, train acc 0.784, test acc 0.810 epoch 3, loss 0.4883, train acc 0.822, test acc 0.854 epoch 4, loss 0.4424, train acc 0.839, test acc 0.858 epoch 5, loss 0.4166, train acc 0.849, test acc 0.864簡潔實現
在Gluon中,只需要在全連接層后添加Dropout層并指定丟棄概率。在訓練模型時,Dropout層將以指定的丟棄概率隨機丟棄上一層的輸出元素;在測試模型時,Dropout層并不發揮作用。
net = nn.Sequential() net.add(nn.Dense(256,activation='relu'),nn.Dropout(drop_prob1), # 在第一個全連接層后添加丟棄層nn.Dense(256, activation='relu'),nn.Dropout(drop_prob2), # 在第二個全連接層后添加丟棄層nn.Dense(10)) net.initialize(init.Normal(sigma=0.01))訓練并測試模型
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate':lr}) d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, trainer) epoch 1, loss 1.1389, train acc 0.558, test acc 0.783 epoch 2, loss 0.5777, train acc 0.786, test acc 0.831 epoch 3, loss 0.4957, train acc 0.819, test acc 0.847 epoch 4, loss 0.4498, train acc 0.836, test acc 0.857 epoch 5, loss 0.4213, train acc 0.846, test acc 0.863forward propagation, backward propagation and computational graph given in this link.
http://zh.gluon.ai/chapter_deep-learning-basics/backprop.html
總結
以上是生活随笔為你收集整理的inverted_dropout的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GA-BP模型的应用——刀具磨损程度预测
- 下一篇: 【教程】Altium Designer