使用丟棄法應對模型過擬合

2021-10-05 02:48:40 字數 4004 閱讀 2468

從零實現

# 匯入包和模組

%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回歸使用交叉熵損失函式 模型選擇 從嚴格意義上講,測試集只...