線性回歸的從零開始實現

2021-10-24 14:46:30 字數 4553 閱讀 7382

import torch

from ipython import display

from matplotlib import pyplot as plt

import numpy as np

import random

# 1、生成資料集

# 訓練資料集樣本數為1000,輸入個數(特徵數)為2

# 線性回歸模型真實權重 w=[2,−3.4] 和偏差 b=4.2

num_inputs =

2num_examples =

1000

true_w =[2

,-3.4]

true_b =

4.2# 生成的資料集x

features = torch.randn(num_examples,num_inputs,dtype=torch.float32)

print

("生成的資料集x:"

,features)

labels = true_w[0]

*features[:,

0]+ true_w[1]

*features[:,

1]+ true_b

# 生成的資料集y

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

0.01

,size=labels.size())

,dtype=torch.float32)

# print(features[0],labels[0])

# plt函式作圖

defuse_svg_display()

:# 用向量圖顯示

display.set_matplotlib_formats(

'svg'

)def

set_figsize

(figsize=

(3.5

,2.5))

: use_svg_display(

) plt.rcparams[

'figure.figsize'

]= figsize

set_figsize(

)plt.scatter(features[:,

1].numpy(

),labels.numpy(),

1)# plt.show()

# 2、讀取資料

# 每次返回batch_size(批量大小)個隨機樣本的特徵和標籤

defdata_iter

(batch_size,features,labels)

: 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)

batch_size =

10for x,y in data_iter(batch_size,features,labels)

:print

(x,y)

break

# 3、初始化模型引數

w = torch.tensor(np.random.normal(0,

0.01

,(num_inputs,1)

),dtype=torch.float32)

# 權重初始化成均值為0、標準差為0.01的正態隨機數

b = torch.zeros(

1,dtype=torch.float32)

# 偏差則初始化成0

# 之後的模型訓練中,需要對這些引數求梯度來迭代引數的值,因此我們要讓它們的requires_grad=true

w.requires_grad_(requires_grad=

true

)b.requires_grad_(requires_grad=

true

)# 4、定義模型

deflinreg

(x, w, b)

:return torch.mm(x,w)

+b # mm函式作矩陣乘法

# 5、定義損失函式

defsquared_loss

(y_hat, y)

:# 真實值y變形成**值y_hat的形狀

return

(y_hat - y.view(y_hat.size())

)**2/

2# 6、定義優化函式

# 自動求梯度模組計算得來的梯度是乙個批量樣本的梯度和。我們將它除以批量大小來得到平均值。

defsgd

(params, lr, batch_size)

:for param in params:

param.data -= lr * param.grad / batch_size

# 7、訓練模型

lr =

0.03

num_epochs =

3net = linreg

loss = squared_loss

for epoch in

range

(num_epochs)

:# 訓練模型一共需要num_epochs個迭代週期

# 在每乙個迭代週期中,會使用訓練資料集中所有樣本一次(假設樣本數能夠被批量大小整除)。x

# 和y分別是小批量樣本的特徵和標籤

for x,y in data_iter(batch_size,features,labels)

: l = loss(net(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 = loss(net(features, w, b)

,labels)

print

('epoch %d, loss %f'

%(epoch +

1, train_l.mean(

).item())

)# 真實值與**值比較

print

(true_w,

'\n'

, w)

print

(true_b,

'\n'

, b)

d:\dev\anaconda\python.exe e:

/dl-pytorch/ch3/demo2.py

tensor([[

1.0830,-

0.8833],

[0.5864

,0.7240],

[0.9755,-

0.6456],

[-1.6580

,0.9215],

[-0.1988,-

1.2996],

[1.0861,-

0.3094],

[0.4570,-

0.8737],

[-0.8036,-

0.2254],

[0.5252

,0.9146],

[-0.0726,-

1.0572]]

) tensor(

[9.3613

,2.9110

,8.3544,-

2.2501

,8.2146

,7.4407

,8.0797

,3.3551

,2.1247

,7.6568])

epoch 1

, loss 0.037553

epoch 2

, loss 0.000137

epoch 3

, loss 0.000051[2

,-3.4]

tensor([[

1.9997],

[-3.3992]]

, requires_grad=

true

)4.2

tensor(

[4.1995

], requires_grad=

true

)process finished with exit code 0

3 2 線性回歸的從零開始實現

小白學深度學習 num inputs 2num examples 1000 truw w 2 3.4 true b 4.2features tf.random.normal num examples,num inputs stddev 0.01 dtype tf.float32 labels tf....

Django 從零開始

方法1 pip install django 1.6.5 測試是否安裝成功 python import django 1,6,5,final 0 django 使用了 python 標準的 distutils 安裝法,在 linux 平台可能包括如下步驟 tar xzvf django tar.gz...

HTML從零開始

一 標籤 1.使用小寫 2.開始標籤常被稱為開放標籤 opening tag 結束標籤常稱為閉合標籤 closing tag 有效 示例 i reallystrong mean thatem 無效 示例 invalid i reallyem mean thatstrong 二 屬性 1.開始標籤包含...