【深度学习】| 线性回归的简单实现
1 概述#
本文的主要目的是通过实现最简单的线性回归模型,理解pytorch在数据导入、模型定义、、损失计算、优化迭代、自动求导和批次训练等方面的特点。
2 数据导入#
首先,生成真实的线性函数,参数为w和b;接着按照w和b的size来生成1000个样本数据
点击查看代码
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)
点击查看代码
def load_array(data_arrays, batch_size, is_train = True):
'''构造一个PyTorch数据迭代器'''
dataset = data.TensorDataset(*data_arrays)# 此处*的作用
return data.DataLoader(dataset, batch_size, shuffle = is_train)
batch_size = 10
data_iter = load_array((features, labels), batch_size)
next(iter(data_iter))
3 模型定义#
使用框架预定义好的层,nn是神经网络的缩写
点击查看代码
from torch import nn
net = nn.Sequential(nn.Linear(2, 1))
点击查看代码
net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
4 定义损失函数#
点击查看代码
loss = nn.MSELoss()
5 定义优化算法#
点击查看代码
trainer = torch.optim.SGD(net.parameters(),lr = 0.03)
6 训练#
使用随机小批量梯度下降法
训练过程中打印的loss是为研究者观察模型是否往参数逐步优化的方向变化而给的一个参考指标。
data_iter中的loss是指一个批次的损失。
trainer.zero_grad()是梯度清零
l.backward()是求解这一个批次的样本的导数和
trainer.step()# 以求得的导数和,结合优化器,更新参数 w和b,然后进行下一批次的训练
点击查看代码
# 训练
num_epochs = 3
for epoch in range(num_epochs):
for X, y in data_iter:
# print(X.shape)
l = loss(net(X), y)# 一个批次的损失
trainer.zero_grad()
l.backward()
trainer.step()
# print(features.shape)
l = loss(net(features), labels)# 整个数据集的损失
print(f'epoch {epoch + 1}, loss {l:f}')
7 打印结果#
点击查看代码
w = net[0].weight.data
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b - b)
作者:Arkon
出处:https://www.cnblogs.com/arkon/p/16593619.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)