線性回歸的簡(jiǎn)潔實(shí)現(xiàn)
- 上一節(jié) 張量:數(shù)據(jù)存儲(chǔ)、線性代數(shù);自動(dòng)微分:計(jì)算梯度
- 開(kāi)源框架,可自動(dòng)化基于梯度的學(xué)習(xí)算法中重復(fù)性的工作
- 數(shù)據(jù)迭代器、損失函數(shù)、優(yōu)化器、神經(jīng)網(wǎng)絡(luò)層
- 使用深度學(xué)習(xí)框架簡(jiǎn)潔實(shí)現(xiàn) 線性回歸模型 生成數(shù)據(jù)集
1. 生成數(shù)據(jù)集
import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)
2. 調(diào)用框架現(xiàn)有api來(lái)讀取數(shù)據(jù)
def load_array(data_arrays,batch_size,is_train=True):
dataset = data.TensorDataset(*data_arrays)
return data.DataLoader(dataset,batch_size,shuffle=is_train)#shuffle是否要隨機(jī)打亂順序
batch_size=10
data_iter=load_array((features,labels),batch_size)
next(iter(data_iter))#使用next從迭代器中獲取第一項(xiàng)
3. 使用框架預(yù)定義好的層
- 標(biāo)準(zhǔn)深度學(xué)習(xí)模型,使用框架預(yù)定義好的層
- 關(guān)注用哪些層來(lái)構(gòu)造模型,不必關(guān)注層的實(shí)現(xiàn)細(xì)節(jié)
- Sequential類將多個(gè)層串聯(lián)在一起,(標(biāo)準(zhǔn)的流水線)
- 當(dāng)給定輸入數(shù)據(jù)時(shí),Sequential實(shí)例將數(shù)據(jù)傳入到第一層,
- 然后將第一層輸出作為第二層輸入,以此類推
# nn 神經(jīng)網(wǎng)絡(luò)縮寫
from torch import nn
# 線性回歸 全連接層 (指定輸入特征形狀,指定輸出特征形狀)
# Sequential 容器
net=nn.Sequential(nn.Linear(2,1))
4. 初始化模型參數(shù)
- 線性回歸模型中的權(quán)重和偏置
# net 就是一個(gè)layer網(wǎng)絡(luò)中的第一個(gè)圖層, weight訪問(wèn)到w,normal使用正態(tài)分布替換掉data的值
net[0].weight.data.normal_(0, 0.01)
# bias偏差
net[0].bias.data.fill_(0)
5. 均方誤差
- MSELoss類 平方范數(shù)(L2范數(shù))
- 默認(rèn)返回所有樣本損失的平均值
loss=nnLMSELoss()
6. 實(shí)例化SGD實(shí)例(優(yōu)化算法)
- 小批量隨機(jī)梯度下降,只需要設(shè)置lr值
# 通過(guò)net.parameters()從模型中獲得
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
7. 訓(xùn)練
- 不必單獨(dú)分配參數(shù);不必定義損失函數(shù);不必手動(dòng)實(shí)現(xiàn)小批量隨機(jī)梯度下降
- 復(fù)雜模型,有所有基本組件
? - 每個(gè)迭代周期
- 完整遍歷一次數(shù)據(jù)集
- (從中獲取一個(gè)小批量輸入和相應(yīng)的標(biāo)簽)
- 調(diào)用net(x)生成預(yù)測(cè)并計(jì)算損失1(前向傳播)
- 通過(guò)反向傳播計(jì)算梯度
- 通過(guò)調(diào)用優(yōu)化器來(lái)更新模型參數(shù)
- 計(jì)算每個(gè)迭代周期后的損失,并打印它來(lái)監(jiān)控訓(xùn)練過(guò)程
num_epochs = 3
for epoch in range(num_epochs):
for X, y in data_iter:
l = loss(net(X) ,y)
trainer.zero_grad()
l.backward()
trainer.step()
l = loss(net(features), labels)
print(f'epoch {epoch + 1}, loss {l:f}')
- 比較生成數(shù)據(jù)集的真實(shí)參數(shù)和通過(guò)有限數(shù)據(jù)集訓(xùn)練獲得的模型參數(shù)
-
- 從net訪問(wèn)所需的層,讀取該層的權(quán)重和偏置
w = net[0].weight.data
print('w的估計(jì)誤差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估計(jì)誤差:', true_b - b)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-630185.html
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-630185.html
到了這里,關(guān)于d2l 線性回歸的簡(jiǎn)潔實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!