從零實現
# 匯入包和模組
%matplotlib inline
import torch
import torch.nn as nn
import numpy as np
import sys
".."
)import d2lzh_pytorch as d2l
print
(torch.__version__)
def
dropout
(x, drop_prob)
: x = x.
float()
assert
0<= drop_prob <=
1# drop_prob的值必須在0-1之間,和資料庫中的斷言乙個意思
keep_prob =
1-drop_prob # 儲存元素概率
# 這種情況下把全部元素丟棄
if keep_prob ==0:
#keep_prob=0等價於1-p=0
return torch.zeros_like(x)
mask =
(torch.rand(x.shape)
< keep_prob)
.float()
# torch.rand()均勻分布,小於號《判別,若真,返回1,否則返回0
return mask * x / keep_prob # 重新計算新的隱藏單元的公式實現
定義模型引數
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# 設定丟棄概率
defnet
(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
訓練和測試模型
num_epochs, lr, batch_size =5,
100.0
,256
# 設定訓練週期,學習率和批量大小
簡潔實現
# 宣告各層網路,dropout層不在測試時發揮作用
net = nn.sequential(d2l.flattenlayer(),
nn.linear(num_inputs, num_hiddens1)
, nn.relu(),
nn.dropout(drop_prob1)
, nn.linear(num_hiddens1, num_hiddens2)
, nn.relu(),
nn.dropout(drop_prob2)
, nn.linear(num_hiddens2,10)
)# 初始化引數
for param in net.parameters():
nn.init.normal_(param, mean=
0, std=
0.1)
訓練和測試模型
# 定義優化器
optimizer = torch.optim.sgd(net.parameters(
), lr=
0.5)
# 訓練模型
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs,
batch_size,
none
,none
, optimizer)
# 訓練集準確率普遍高於測試集,但兩者相差不大,符合實際情況
新增權重衰減係數 weight_decay
# 定義優化器
optimizer = torch.optim.sgd(net.parameters(
), weight_decay=
0.1, lr=
0.5)
# 訓練模型
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs,
batch_size,
none
,none
, optimizer)
# 準確率急劇下降,說明丟棄法和權重衰減同時使用對模型複雜度降低過於巨大
丟棄法為什麼可以防止過擬合
丟棄法為什麼和weight decay l2 norm 一樣也能達到防止過擬合的效果。什麼是丟棄法 當我們對該隱藏層使 丟棄法時,該層的隱藏單元將有 定概率被丟棄掉。設丟棄概率為p,那麼 有p 的概率hi 會被清零,有1 p 的概率hi 會除以1 p 做拉伸。丟棄概率是丟棄法的超引數。h1,h2,h...
模型過擬合
訓練模型都會將資料集分為兩部分,一般會將0.8比例的資料集作為訓練集,將0.2比例的資料集作為測試集,來訓練模型。模型過擬合就是訓練出來的模型在訓練集上表現很好,但是在測試集上表現較差的一種現象,也就是模型對已有的訓練集資料擬合的非常好 誤差值等於0 對於測試集資料擬合的非常差,模型的泛化能力比較差...
過擬合及應對方法
訓練誤差和泛化誤差 訓練誤差 模型在訓練資料集上表現的誤差 泛化誤差 模型在任意乙個測試資料樣本上表現的誤差期望,常常通過測試資料集上的誤差來近似 計算訓練誤差和泛化誤差可以使用損失函式 loss 線性回歸使用平方誤差損失函式 softmax回歸使用交叉熵損失函式 模型選擇 從嚴格意義上講,測試集只...