深度學習(七) 過擬合欠擬合

2021-10-03 01:30:07 字數 4130 閱讀 1108

整體**

從標準正態分佈中隨機抽取資料組成張量,形狀由sizes定義

//函式原型

torch.randn(

*sizes, out=

none

)//應用

features = torch.randn(

(n_train + n_test,1)

)//生成200

*1的張量

在給定維度上對輸入的張量序列seq進行連線操作。0為行,1為列。

對輸入input按元素求exponent次冪,並返回結果張量。

//函式原型

torch.cat(inputs, dimension=0)

torch.

pow(

input

, exponent, out=

none

)//應用

poly_features = torch.cat(

(features, torch.

pow(features,2)

,torch.

pow(features,3)

),1)

%matplotlib inline

import torch

import numpy as np

import sys

"/home/kesci/input"

)import d2lzh1981 as d2l

print

(torch.__version__)

//初始化模型引數

n_train, n_test, true_w, true_b =

100,

100,

[1.2,-

3.4,

5.6],5

features = torch.randn(

(n_train + n_test,1)

)poly_features = torch.cat(

(features, torch.

pow(features,2)

, torch.

pow(features,3)

),1)

labels =

(true_w[0]

* poly_features[:,

0]+ true_w[1]

* poly_features[:,

1]+ true_w[2]

* poly_features[:,

2]+ true_b)

labels += torch.tensor(np.random.normal(0,

0.01

, size=labels.size())

, dtype=torch.

float

)features[:2

], poly_features[:2

], labels[:2

]//輸出每個張量的前兩個元素

//定義、訓練、測試模型

defsemilogy

(x_vals, y_vals, x_label, y_label, x2_vals=

none

, y2_vals=

none

, legend=

none

, figsize=

(3.5

,2.5))

:# d2l.set_figsize(figsize)

d2l.plt.xlabel(x_label)

d2l.plt.ylabel(y_label)

d2l.plt.semilogy(x_vals, y_vals)

if x2_vals and y2_vals:

d2l.plt.semilogy(x2_vals, y2_vals, linestyle=

':')

d2l.plt.legend(legend)

num_epochs, loss =

100, torch.nn.mseloss(

)def

fit_and_plot

(train_features, test_features, train_labels, test_labels)

:# 初始化網路模型

net = torch.nn.linear(train_features.shape[-1

],1)

# 通過linear文件可知,pytorch已經將引數初始化了,所以我們這裡就不手動初始化了

# 設定批量大小

batch_size =

min(

10, train_labels.shape[0]

)

dataset = torch.utils.data.tensordataset(train_features, train_labels)

# 設定資料集

train_iter = torch.utils.data.dataloader(dataset, batch_size, shuffle=

true

)# 設定獲取資料方式

optimizer = torch.optim.sgd(net.parameters(

), lr=

0.01

)# 設定優化函式,使用的是隨機梯度下降優化

train_ls, test_ls =

,[]for _ in

range

(num_epochs)

:for x, y in train_iter:

# 取乙個批量的資料

l = loss(net(x)

, y.view(-1

,1))

# 輸入到網路中計算輸出,並和標籤比較求得損失函式

optimizer.zero_grad(

)# 梯度清零,防止梯度累加干擾優化

l.backward(

)# 求梯度

optimizer.step(

)# 迭代優化函式,進行引數優化

train_labels = train_labels.view(-1

,1) test_labels = test_labels.view(-1

,1), train_labels)

.item())

# 將訓練損失儲存到train_ls中

, test_labels)

.item())

# 將測試損失儲存到test_ls中

print

('final epoch: train loss'

, train_ls[-1

],'test loss'

, test_ls[-1

])

semilogy(

range(1

, num_epochs +1)

, train_ls,

'epochs'

,'loss'

,range(1

, num_epochs +1)

, test_ls,

['train'

,'test'])

print

('weight:'

, net.weight.data,

'\nbias:'

, net.bias.data)

//三種影象

fit_and_plot(poly_features[

:n_train,:]

, poly_features[n_train:,:

], labels[

:n_train]

, labels[n_train:])

fit_and_plot(features[

:n_train,:]

, features[n_train:,:

], labels[

:n_train]

, labels[n_train:])

fit_and_plot(poly_features[0:

2,:]

, poly_features[n_train:,:

], labels[0:

2], labels[n_train:

])

過擬合欠擬合

一篇文章,帶你明白什麼是過擬合,欠擬合以及交叉驗證 在本文中也許你會掌握機器學習中最核心的概念 偏差 方差權衡.其主要想法是,你想建立盡可能 準確並且仍能適用於新資料的模型 這是泛化 危險的是,你可以輕鬆的在你制定的資料中建立過度擬合本地噪音的模型,這樣的模型是無用的,並且導致弱泛化能力,因為雜訊是...

過擬合 欠擬合

無論在機器學習還是深度學習建模當中都可能會遇到兩種最常見結果,一種叫過擬合 over fitting 另外一種叫欠擬合 under fitting 所謂過擬合 over fitting 其實就是所建的機器學習模型或者是深度學習模型在訓練樣本中表現得過於優越,導致在驗證資料集以及測試資料集中表現不佳。...

過擬合與欠擬合(動手學深度學習)

方法 權重衰減等價於 l2 範數正則化 regularization 正則化通過為模型損失函式新增懲罰項使學出的模型引數值較小,是應對過擬合的常用手段。l2 範數正則化 regularization l2 範數正則化在模型原損失函式基礎上新增 l2 範數懲罰項,從而得到訓練所需要最小化的函式。l2 ...