日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

inverted_dropout

發布時間:2024/1/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.863

forward propagation, backward propagation and computational graph given in this link.

http://zh.gluon.ai/chapter_deep-learning-basics/backprop.html

總結

以上是生活随笔為你收集整理的inverted_dropout的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。