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.開始標籤包含...