当前位置: 首页 > news >正文

【PyTorch】线性回归

文章目录

  • 1. 模型与代码实现
  • 2. Q&A

1. 模型与代码实现

  • 模型
    y ^ = w 1 x 1 + . . . + w d x d + b = w ⊤ x + b . \hat{y} = w_1 x_1 + ... + w_d x_d + b = \mathbf{w}^\top \mathbf{x} + b. y^=w1x1+...+wdxd+b=wx+b.

  • 代码实现

import torch
from torch import nn
from torch.utils import data
from d2l import torch as d2l# 全局参数设置
batch_size = 10
num_epochs = 3
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')# 生成数据集
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)
features, labels = features.to(device), labels.to(device)# 加载数据集
dataset = data.TensorDataset(features, labels)
dataloader = data.DataLoader(dataset, batch_size, shuffle=True)# 创建神经网络
net = nn.Linear(2, 1).to(device)# 初始化模型参数
nn.init.normal_(net.weight, mean=0, std=0.01)
nn.init.constant_(net.bias, val=0)# 设置损失函数
criterion = nn.MSELoss()# 设置优化器
optimizer = torch.optim.SGD(net.parameters(), lr=0.03)# 训练模型
for epoch in range(num_epochs):for X, y in dataloader:X, y = X.to(device), y.to(device)loss = criterion(net(X) ,y)optimizer.zero_grad()loss.backward()optimizer.step()loss = criterion(net(features), labels)print(f'epoch {epoch + 1}, loss {loss:f}')# 评估训练结果
w = net.weight.data.cpu()
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net.bias.data.cpu()
print('b的估计误差:', true_b - b)

输出结果

epoch 1, loss 0.000211
epoch 2, loss 0.000099
epoch 3, loss 0.000099
w的估计误差: tensor([ 4.2558e-04, -5.3167e-05])
b的估计误差: tensor([0.0005])

2. Q&A

  • 如何安装d2l模块?
    pip install d2l
    
  • 为什么模型参数初始化时要将偏置设为0?
    在机器学习中,我们通常会使用非常小的学习率来进行梯度下降,以防止在更新参数时发生剧烈的波动。如果偏置项的初始值不为0,那么在开始训练模型时,可能会因为偏置的影响,导致权重更新的方向出现偏差。
  • 为什么选择均方损失作为线性回归模型的损失函数?
    因为在高斯噪声的假设下,最小化均方误差 ⇔ \Leftrightarrow 对给定 x \mathbf{x} x观测 y y y的极大似然估计 ⇔ w , b \Leftrightarrow \mathbf{w},b w,b取最优值。详细推导。均方误差函数如下: M S E = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 \mathbf{MSE}=\frac{1}{n}\sum_{i=1}^{n}{(y_i-\hat{y_i})^2} MSE=n1i=1n(yiyi^)2其中 y i y_i yi是真实数据, y i ^ \hat{y_i} yi^是拟合数据。
  • 如何理解模型训练过程?
    for epoch in range(num_epochs):for X, y in dataloader:X, y = X.to(device), y.to(device)# 计算网络输出结果与预期结果的误差loss = criterion(net(X) ,y)# 清空参数梯度缓存值,否则梯度会与上一个batch的数据相关optimizer.zero_grad()# 误差反向传播计算参数梯度值loss.backward()# 更新模型参数optimizer.step()# 计算在整个训练集上的误差loss = criterion(net(features), labels)print(f'epoch {epoch + 1}, loss {loss:f}')
    
http://www.lryc.cn/news/251930.html

相关文章:

  • 硝烟弥漫的科技战场——GPT之战
  • re:Invent 构建未来:云计算生成式 AI 诞生科技新局面
  • oneApi实现并⾏排序算法
  • 语音芯片的BUSY状态指示功能特征:提升用户体验与系统稳定性的关键
  • Leetcode2661. 找出叠涂元素
  • 免费最新6款热门SEO优化排名工具
  • 绝地求生在steam叫什么?
  • Elasticsearch:什么是大语言模型(LLM)?
  • Kubernetes1.27容器化部署Prometheus
  • fasterxml 注解组装实体
  • 自写一个函数将js对象转为Ts的Interface接口
  • 【数据结构】拆分详解 - 二叉树的链式存储结构
  • Laravel修改默认的auth模块为md5(password+salt)验证
  • OpenStack-train版安装之安装Keystone(认证服务)、Glance(镜像服务)、Placement
  • 【九日集训】第九天:简单递归
  • Prime 1.0
  • Java 如何正确比较两个浮点数
  • Qt 如何操作SQLite3数据库?数据库创建和表格的增删改查?
  • 【Hadoop】分布式文件系统 HDFS
  • 【Python-随笔】使用Python实现屏幕截图
  • Sun Apr 16 00:00:00 CST 2023格式转换
  • 使用mongodb实现简单的读写操作
  • C语言实现Cohen_Sutherland算法
  • MySQL进阶_EXPLAIN重点字段解析
  • 视图层与模板层
  • MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
  • 快速创建桌面端(electron-egg)
  • docker配置redis插件
  • 前端入口教程_web01
  • Win7 SP1 x64 Google Chrome 字体模糊