先貼**
import torch
import numpy as np
import random
trainsetshape =
(100,2
)true_w = torch.tensor([[
2.00],
[-3.4]
], dtype=torch.float64)
true_b =
4.2def
data_iter
(features, labels, batch_size=10)
: num_examples =
len(features)
indices =
list
(range
(num_examples)
) random.shuffle(indices)
# 樣本的讀取順序是隨機的
for i in
range(0
, num_examples, batch_size)
: j = torch.longtensor(indices[i:
min(i + batch_size, num_examples)])
# 最後一次可能不足乙個batch
yield features.index_select(
0, j)
, labels.index_select(
0, j)
deflinreg
(x, w, b)
:return torch.mm(x, w)
+ b# x: n*2
# w: 2*1
# b: n*1
defsquared_loss
(y_hat, y)
:# 注意這裡返回的是向量, 另外, pytorch裡的mseloss並沒有除以 2
return
((y_hat - y.view(y_hat.size())
)**2)
*0.5
defsgd
(params, lr, batch_size)
:for param in params:
param.data -= lr * param.grad # 注意這裡更改param時用的param.data
if __name__ ==
'__main__'
:# 生成資料
features = torch.from_numpy(np.random.normal(0,
1, trainsetshape)
) labels = torch.mm(features, true_w)
+ true_b
labels += torch.from_numpy(np.random.normal(0,
0.01
, labels.shape)
) w = torch.tensor([[
5],[
5]], dtype=torch.float64)
b = torch.tensor([5
], dtype=torch.float64)
w.requires_grad_(requires_grad=
true
) b.requires_grad_(requires_grad=
true
) lr =
0.03
num_epochs =
15 batch_size =
10for epoch in
range
(num_epochs)
:# 訓練模型一共需要num_epochs個迭代週期
# 在每乙個迭代週期中,會使用訓練資料集中所有樣本一次(假設樣本數能夠被批量大小整除)。x
# 和y分別是小批量樣本的特徵和標籤
for x, y in data_iter(features, labels, batch_size=10)
: l = squared_loss(linreg(x, w, b)
, y)
.sum()
# l是有關小批量x和y的損失
l.backward(
)# 小批量的損失對模型引數求梯度
sgd(
[w, b]
, lr, batch_size)
# 使用小批量隨機梯度下降迭代模型引數
# 不要忘了梯度清零
w.grad.data.zero_(
) b.grad.data.zero_(
) train_l = squared_loss(linreg(features, w, b)
, labels)
print
('epoch %d, loss %f'
%(epoch +
1, train_l.mean(
).item())
)print
(w)print
(b)
**分別:匯入包、定義了一些常量、定義了一些函式、定義了**主體
訓練模型y = b + x1w1 + x2w2
小批量隨機梯度下降演算法:比如乙個資料集有10w條資料,你同時做矩陣運算不太現實,所以就要批量處理。比如每次處理100條、一千條。
# 生成資料
features = torch.from_numpy(np.random.normal(0,
1, trainsetshape)
) labels = torch.mm(features, true_w)
+ true_b
labels += torch.from_numpy(np.random.normal(0,
0.01
, labels.shape)
)
np.random.normal(): 生成乙個形狀為trainsetshape的,服從0,1正態分佈的矩陣
資料型別是 numpy,要轉換成tensor,要用到 torch.from_numpy() 函式
torch.mm() 矩陣乘法
我們先自己生產100條資料,設w1 = 2, w2 = =3.4, bias = 4.2, 然後再加上隨機擾動
w = torch.tensor([[
5],[
5]], dtype=torch.float64)
b = torch.tensor([5
], dtype=torch.float64)
w.requires_grad_(requires_grad=
true
) b.requires_grad_(requires_grad=
true
)# learning rate
lr =
0.03
# 迭代次數
num_epochs =
15#分塊大小
batch_size =
10
這裡要講一講autograd
我們宣告了w、b是要在以後求微分的requires_grad=true
那麼之後所有用w、b運算出來的變數都會帶有requires_grad=true
比如loss_function(b, w),中b和w作為線性回歸中喪失函式的引數,是要以後迭代求微分來進行梯度下降的。
for epoch in
range
(num_epochs)
:# 訓練模型一共需要num_epochs個迭代週期
# 在每乙個迭代週期中,會使用訓練資料集中所有樣本一次(假設樣本數能夠被批量大小整除)。
# x和y分別是小批量樣本的特徵和標籤
for x, y in data_iter(features, labels, batch_size=10)
: l = squared_loss(linreg(x, w, b)
, y)
.sum()
# l是有關小批量x和y的損失
l.backward(
)# 小批量的損失對模型引數求梯度
sgd(
[w, b]
, lr, batch_size)
# 使用小批量隨機梯度下降迭代模型引數
# 不要忘了梯度清零
w.grad.data.zero_(
) b.grad.data.zero_(
) train_l = squared_loss(linreg(features, w, b)
, labels)
print
('epoch %d, loss %f'
%(epoch +
1, train_l.mean(
).item())
)
l = squared_loss(linreg(x, w, b)
, y)
.sum()
l.backward(
)
在這裡,autograd要求求梯度必須為乙個1維的值,即shape必須為1x1
backward為求梯度,然後會反射會涉及的變數
批量梯度下降,隨機梯度下降,小批量梯度下降
在機器學習領域中,梯度下降的方式有三種,分別是 批量梯度下降法bgd 隨機梯度下降法sgd 小批量梯度下降法mbgd,並且都有不同的優缺點。下面我們以線性回歸演算法 也可以是別的演算法,只是損失函式 目標函式 不同而已,它們的導數的不同,做法是一模一樣的 為例子來對三種梯度下降法進行比較。假設 特徵...
小批量梯度下降演算法 python
coding utf 8 created on tue mar 13 20 49 03 2018 author import numpy as np from scipy import stats import matplotlib.pyplot as plt 產生訓練資料,生成模型為2 x 5 r...
小批量梯度下降演算法步驟 優化演算法之梯度下降演算法
在應用機器學習演算法時,我們通常採用梯度下降法來對採用的演算法進行訓練。其實,常用的梯度下降法還具體包含有三種不同的形式,它們也各自有著不同的優缺點。1.批量梯度下降法bgd 現在下面以lr演算法為例對這三種演算法從原理到 進行講解 由lr演算法可知lr演算法的損失函式為 損失函式j 最小值時的 則...