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

(3)深度学习学习笔记-简单线性模型

文章目录

  • 一、线性模型
  • 二、实例
    • 1.pytorch求导功能
    • 2.简单线性模型(人工数据集)
  • 来源


一、线性模型

一个简单模型:假设一个房子的价格由卧室、卫生间、居住面积决定,用x1,x2,x3表示。
那么房价y就可以认为y=w1x1+w2x2+w3x3+b,w为权重,b为偏差。
第一步
在这里插入图片描述
线性模型可以看做是单层(带权重的层是1层)神经网络。
在这里插入图片描述
第二步:
定义loss,衡量预估质量:真实值和预测值的差距
在这里插入图片描述
这里带1/2是方便求导的时候把2消去。
训练数据:收集数据来决定权重和偏差
训练损失:loss=1/n∑[(真实值-预测值(xi和权重的内积-偏差))平方]。目标是找到最小的loss
在这里插入图片描述
第三步:优化
优化方法:梯度下降。先挑选一个初值w0,之后不断更新w0使他接近最优解。更新方法是wt=wt-1 - 学习速率
梯度。
在这里插入图片描述
Learning rate不能太小(到达一个点要走很多步),也不能太大(一直震荡没有真的下降)
在这里插入图片描述
在这里插入图片描述
在整个训练集上梯度下降太贵,跑一次模型可能要数分钟/小时。所以采用小批量随机梯度下降,随机采样b个样本用这b个样本来近似损失。b不能太大也不能太小
在这里插入图片描述

二、实例

1.pytorch求导功能

代码如下:

# 自动求导
import torch
# 假设对函数y=2xT x关于列向量求导
x = torch.arange(4.0)
# 算y关于x的梯度之前,需要一个地方来存储梯度
x.requires_grad_(True)  # 等价于x=torch.arange(4.0,requires_grad=True)
print(x.grad)  # 默认值是None y关于x的导数存在这里y=2*torch.dot(x,x)
y.backward() # 求导
print(x.grad)
print(x.grad==4*x)# 在默认情况下,PyTorch会累积梯度,需要清除之前的值
x.grad.zero_()y = x.sum()
y.backward()
print(x.grad)x.grad.zero_()
y=x*x
u=y.detach()# 把y当成常数而不是x的函数
z=u*x
z.sum().backward()
print(x.grad==u)

2.简单线性模型(人工数据集)

代码如下:

# 构建人工数据集(好处是知道w和b)
# 根据w=[2,-3.4] b=4.2 和噪声生成数据集和标签 y=Xw+b+噪声
import numpy as np
import torch
from torch import nn
from torch.utils import data# 生成数据
def synthetic_data(w, b, num_examples):"""生成y=Xw+b+噪声"""X = np.random.normal(0, 1, (num_examples, len(w)))  # 均值为0,方差为1,num_ex个样本,列数=w的个数y = np.dot(X, w) + b  # y=Xw+by += np.random.normal(0, 0.01, y.shape)  # 加上随机噪音x1 = torch.tensor(X, dtype=torch.float32)  # 把np转化为torchy1 = torch.tensor(y, dtype=torch.float32)return x1, y1.reshape((-1, 1))  # 列向量反馈# 读取数据
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)  # shuffle:是否需要随机打乱true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)batch_size = 10
data_iter = load_array((features, labels), batch_size)
# 使用iter构造Python迭代器,并使用next从迭代器中获取第一项。
print(next(iter(data_iter)))# 定义模型
# nn是神经网络的缩写
net = nn.Sequential(nn.Linear(2, 1))  # 输入维度是2 输出是1 sequential相当于一个list of layer# 初始化参数 net[0]访问这个layer
net[0].weight.data.normal_(0, 0.01)  # normal:使用正态分布替换weight的值,均值为0,方差为0.01
net[0].bias.data.fill_(0)  # bias直接设为0# 定义loss:mseloss类
loss = nn.MSELoss()# 定义优化算法
trainer = torch.optim.SGD(net.parameters(), lr=0.03)  # net.patameters():所有参数  ,lr:learning rate# 训练
num_epochs = 3
for epoch in range(num_epochs):  # 对所有数据扫一遍for X, y in data_iter:  # 拿出一个批量大小的x和yl = loss(net(X), y)  # x和y的小批量损失trainer.zero_grad()  # 梯度清零l.backward()  # 计算梯度trainer.step()  # 模型更新l = loss(net(features), labels)  # 计算损失print(f'epoch {epoch + 1}, loss {l:f}')

来源

b站 跟李沐学AI 动手学深度学习v2 08

http://www.lryc.cn/news/94387.html

相关文章:

  • pytorch3d 安装报错 RuntimeError: Not compiled with GPU support pytorch3d
  • spring工程的启动流程?bean的生命周期?提供哪些扩展点?管理事务?解决循环依赖问题的?事务传播行为有哪些?
  • 使用 Zabbix 监控 RocketMQ列举监控项和触发器
  • uniApp:路由与页面跳转及传参
  • Java中操作文件(二)
  • springboot+vue在线考试系统(java项目源码+文档)
  • 样式方案:在 Vite 中接入现代化的 CSS 工程化方案
  • C#获取根目录实现方法汇总
  • vue获取当前坐标并通过天地图逆转码为省市区
  • 【MySQL】事务及其隔离性/隔离级别
  • 计算机由于找不到d3dx9_35.dll,无法启动软件游戏的三个修复方法
  • 第三章 模型篇:模型与模型的搭建
  • 深度学习一些简单概念的整理笔记
  • Vue3中引入Element-plus
  • 如何查看 Facebook 公共主页的广告数量上限?
  • U-Boot移植 (2)- LCD 驱动修改和网络驱动修改
  • Ubuntu 23.10 现在由Linux内核6.3提供支持
  • Python 学习之NumPy(一)
  • Nftables栈溢出漏洞(CVE-2022-1015)复现
  • 【C++】 Qt-事件(上)(事件、重写事件、事件分发)
  • k8s部署springboot
  • 备战秋招002(20230704)
  • 游泳买耳机买什么的比较好,列举几款实战性好的游泳耳机
  • 【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)
  • Java基础-多线程JUC-生产者和消费者
  • day2 QT按钮与容器
  • JPA 批量插入较大数据 解决性能慢问题
  • 为啥离不了 linux
  • 基于分形的置乱算法和基于混沌系统的置乱算法哪种更安全?
  • pve使用cloud-image创建ubuntu模板