深度學習模型常常使⽤丟棄法(dropout)來應對過擬合問題。丟棄法有⼀些不同的變體。本節中提到的丟棄法特指倒置丟棄法(inverted dropout)。
%matplotlib inline
import torch
import torch.nn as nn
import numpy as np
import sys
import d2lzh_pytorch as d2l
def dropout(x, drop_prob):
x = x.float()
assert 0 <= drop_prob <= 1
keep_prob = 1 - drop_prob
# 這種情況下把全部元素都丟棄
if keep_prob == 0:
return torch.zeros_like(x)
mask = (torch.randn(x.shape) < keep_prob).float()
return mask * x / keep_prob
x = torch.arange(16).view(2, 8)
dropout(x, 0)
丟棄率為0.5
dropout(x, 0.5)
丟棄率為1.0
dropout(x, 1.0)
執行結果:
# 定義模型引數
num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256
w1 = torch.tensor(np.random.normal(0, 0.01, size=(num_inputs,
num_hiddens1)), dtype=torch.float, requires_grad=true)
b1 = torch.zeros(num_hiddens1, requires_grad=true)
w2 = torch.tensor(np.random.normal(0, 0.01, size=(num_hiddens1,
num_hiddens2)), dtype=torch.float, requires_grad=true)
b2 = torch.zeros(num_hiddens2, requires_grad=true)
w3 = torch.tensor(np.random.normal(0, 0.01, size=(num_hiddens2,
num_outputs)), dtype=torch.float, requires_grad=true)
b3 = torch.zeros(num_outputs, requires_grad=true)
params = [w1, b1, w2, b2, w3, b3]
# 定義模型
drop_prob1, drop_prob2 = 0.2, 0.5
def net(x, is_training=true):
x = x.view(-1, num_inputs)
h1 = (torch.matmul(x, w1) + b1).relu()
if is_training: # 只在訓練模型時使⽤丟棄法
h1 = dropout(h1, drop_prob1) # 在第⼀層全連線後新增丟棄層
h2 = (torch.matmul(h1, w2) + b2).relu()
if is_training:
h2 = dropout(h2, drop_prob2) # 在第⼆層全連線後新增丟棄層
return torch.matmul(h2, w3) + b3
在對模型評估的時候不應該進⾏丟棄,所以我們修改⼀下 d2lzh_pytorch 中 的evaluate_accuracy 函式如下:
def evaluate_accuracy(data_iter, net):
acc_sum, n = 0.0, 0
for x, y in data_iter:
if isinstance(net, torch.nn.module):
net.eval() # 評估模式, 這會關閉dropout
acc_sum += (net(x).argmax(dim=1) == y).float().sum().item()
net.train() # 改回訓練模式
else: # ⾃定義的模型
if('is_training' in net.__code__.co_varnames): # 如果有is_training這個引數
需要restart kernel才有效。
num_epochs, lr, batch_size = 5, 100.0, 256
loss = torch.nn.crossentropyloss()
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)
測試結果:
動手學深度學習 三 丟棄法 gluon
注 本文為李沐大神的 動手學深度學習 的課程筆記!import mxnet as mx from mxnet import nd from mxnet import gluon from mxnet import autograd from mxnet.gluon import nn from ut...
《動手學深度學習》第八天 丟棄法
深度學習模型常常使用丟棄法 dropout 來應對過擬合問題,本節中提到的丟棄法特指倒置丟棄法 inverted dropout 由於丟棄法在訓練中隱藏層神經元的丟棄是隨機的,輸出層的計算無法過度依賴隱藏單元中的任乙個,從而可以用來應對過擬合。下面的dropout函式將以drop prob的概率丟棄...
深度學習之聯邦學習
聯邦學習 federated learning 能夠讓ai演算法借助位於不同站點的資料中獲得經驗。該方法能夠讓多個組織協作開發模型,而且不需要彼此之間直接共享敏感的資料 在多次訓練迭代過程中,共享模型所覆蓋的資料範圍會比任何乙個組織內部擁有的資料都要大得多。難點 不僅僅是資料量的問題,資料集還需要極...