Pytorch之如何dropout避免過擬合

2022-09-29 14:09:13 字數 3493 閱讀 9499

注意:測試過程中,一定要注意模式切換

過擬合是當資料量較小時或者輸出結果過於依賴某些特定的神經元,訓練神經網路訓練會發生一種現象。出現這種現象的神經網路**的結果並不具有普遍意義,其**結果極不準確。

1.增加資料量

2.l1,l2,l3…正規化,即在計算誤差值的時候加上要學習的引數值,當引數改變過大時,誤差也會變大,通過這種懲罰機制來控制過擬合現象

3.dropout正規化,在訓練過程中通過隨機遮蔽部分神經網路連線,使神經網路不完整,這樣就可以使神經網路的**結果不會過分依賴某些特定的神經元

例子這裡小編通過dropout正規化的列子來更加形象的了解神經網路的過擬合現象

import torch

import matplotlib.pyplot as plt

n_samples = 20

n_hidden = 300

# train資料

x = torch.unsqueeze(torch.linspace(-1, 1, n_samples), 1)

y = x + 0.3*torch.normal(torch.zeros(n_samples, 1), torch.ones(n_samples, 1))

# test資料

test_x = torch.unsqueeze(torch.linspace(-1, 1, n_samples), 1)

test_y = test_x + 0.3*torch.normal(torch.zeros(n_samples, 1), torch.ones(n_samples, 1))

# 視覺化

plt.scatter(x.data.numpy(), y.data.numpy(), c='magenta', s=50, alpha=0.5, label='train')

plt.scatter(test_x.data.numpy(), test_y.data.numpy(), c='cyan', s=50, alpha=0.5, label='test')

plt.legend(loc='upper left')

plt.ylim((-2.5, 2.5))

plt.show()

# 網路一,未使用dropout正規化

net_overfitting = torch.nn.sequential(

torch.nn.linear(1, n_hidden),

torch.nn.relu(),

torch.nn.linear(n_hidden, n_hidden),

torch.nn.relu(),

torch.nn.linear(n_hidden, 1),

)# 網路二,使用dropout正規化

net_dropped = torch.nn.sequential(

torch.nn.linear(1, n_hidden),

torch.nn.dropout(0.5), # 隨機遮蔽50%的網路連線

torch.nn.relu(),

torch.nn.linear(n_hidden, n_hidden),

torch.nn.dropout(0.5), # 隨機遮蔽50%的網路連線

torch.nn.relu(),

torch.nn.linear(n_hidden, 1),

)# 選擇優化器

optimizer_ofit = torch.optim.adam(net_overfitting.parameters(), lr=0.01)

optimizer_drop = torch.optim.adam(net_dropped.parameters(), lr=0.01)

# 選擇計算誤差的工具

loss_func = torch.nn.mseloss()

plt.ion()

for t in range(500):

# 神經網路訓練資料的固定過程

pred_ofit = net_overfitting(x)

pred_drop = net_dropped(x)

loss_ofit = loss_func(pred_ofit, y)

loss_drop = loss_func(pred_drop, y)

optimizer_ofit.zero_grad()

optimizer_drop.zero_grad()

loss_ofit.backward()

loss_drop.backward()

optimizer_ofit.step()

optimizer_drop.step()

if t % 10 == 0:

# 脫離訓練模式,這裡便於展示神經網www.cppcns.com絡的變化過程

net_overfitting.eval()

net_dropped.eval()

# 視覺化

plt.cla()

test_pred_ofit = net_overfitting(test_x)

test_pred_drop = net_dropped(test_x)

plt.scatter(x.data.numpy(), y.data.numpy(), c='magenta', s=50, alpha=0.3, label='train')

plt.scatter(test_x.data.numpy(), test_y.data.numpy(), c='cyan', s=50, alpha=0.3, label='test')

plt.plot(test_x.data.numpy(), test_pred_ofit.data.numpy(), 'r-', lw=3, label='overfitting')

plt.plot(test_x.data.numpy(), test_pred_drop.data.numpy(), 'b--', lw=3, label='dropout(50%)')

plt.text(0, -1.2, 'overfitting loss=%.4f' % loss_func(test_pred_ofit, test_y).data.numpy(),

fontdict=)

plt.text(0, -1.5, 'dropout loss=%.4f' % loss_func(test_pred_drop, test_y).data.numpy(),

fontdict=)

plt.legend(loc='upper left'); plt.ylim((-2.5, 2.5));plt.pause(0.1)

# 重新進入訓練模式,並繼續上次訓練

net_ovwww.cppcns.comerfitting.train()

net_dropped.train()

plt.ioff()

plt.show()

可以看到紅色的線雖然更加擬合tr程式設計客棧ain資料,但是通過test資料發現它的誤差反而比較大

本文標題: pytorch之如何dropout避免過擬合

本文位址: /jiaoben/python/398697.html

如何安裝pytorch

離線安裝 用conda安裝會比較方便,下面直接用conda安裝 conda config add channels conda config add channels conda config add channels 或者,直接改.condarc檔案 注意 沒有自己電腦gpu,就不要安裝cuda了...

如何安裝 PyTorch

現在使用 pytorch 框架進行深度學習的人越來越多了,但是 torch 的安裝 gpu 版本 和普通第三方包的安裝過程不太一樣,因為涉及到電腦的顯示卡驅動版本,下面來看看安裝 pytorch 的正確姿勢。開啟 nvidia 控制面板,點選工具欄幫助 系統資訊,在彈出的對話方塊中有如下資訊 可以看...

Pytorch之線性回歸

import torch from torch import nn import numpy as np import torch.utils.data as data from torch.nn import init 使得模型的可復現性 torch.manual seed 1 設定預設的資料格式...