pytorch 实现线性回归(Pytorch 03)

一 从零实现线性回归

1.1 生成训练数据

原始 计算公式, y = 2x_1 - 3.4x_2 + 4.2

我们先使用该公式生成一批数据,然后使用 结果数据去计算 计算 w1, w2 和 b。

%matplotlib inline
import random
import torch
from d2l import torch as d2ldef synthetic_data(w, b, num_examples): #@save"""生成y=Xw+b+噪声"""X = torch.normal(0, 1, (num_examples, len(w)))y = torch.matmul(X, w) + by += torch.normal(0, 0.01, y.shape)return X, y.reshape((-1, 1))
true_w = torch.tensor([2, -3.4])
true_b = 4.2
X, y = synthetic_data(true_w, true_b, 1000)print(f'X:{X[:2, :]}')  # 2 * 1.1020 - 3.4 * 1.0722 + 4.2 = 2.758  y1:2.76
print(f'y: {y[:2]}')
# X:tensor([[ 1.1020,  1.0722],
#         [ 1.0747, -1.3082]])
# y: tensor([[ 2.7678],
#         [10.7949]])

可以看到 结果值y 是 使用 数据 计算得到的。

1.2 数据拆分

将数据输入 数据生成器 中,将数据按批次进行拆分,不要一次全部输入模型中,每次输入10个数据,当我们运行迭代时,我们会连续地获得不同的小批量,直至遍历完整个数据集,在深度学习框架中实现的内置迭代器效率要高得多,它可以处理存储在文件中的 数据和数据流提供的数据。:

def data_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):batch_indices = torch.tensor(indices[i: min(i + batch_size, num_examples)])yield features[batch_indices], labels[batch_indices]

 查看数据拆分示例:

batch_size = 10
for feature, label in data_iter(batch_size, X, y):print(feature, '\n', label)break

1.3 初始化模型参数

随机初始化 特征权重w1, w2, b, 随机给个初始值才可以让它不断去靠近我们的实际权重值,从均值为0、标准差为0.01的正态分布中采样随机数来初始化权重,并将 偏置初始化为0。:

w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
w, b# (tensor([[-0.0119],
#          [ 0.0133]], requires_grad=True),
#  tensor([0.], requires_grad=True))

1.4 定义模型 

用于前向传播的 模型,通过该模型计算预测值,要计算线性模型的输 出,我们只需计算输入特征X和模型权重w的矩阵‐向量乘法后加上偏置b:

def linreg(X, w, b): #@save"""线性回归模型"""return torch.matmul(X, w) + b  # 用于计算两个张量(tensor)的矩阵乘法。

1.5 定义损失函数

本次使用 平方损失 作为损失函数:

def squared_loss(y_hat, y): #@save"""均方损失"""return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2

1.6 定义优化算法

使用 随机梯度下降作为优化算法,在每一步中,使用从数据集中随机抽取的一个小批量,然后根据参数计算损失的梯度:

def sgd(params, lr, batch_size): #@save # param:w1, w2, b"""小批量随机梯度下降"""with torch.no_grad():for param in params:param -= lr * param.grad / batch_sizeparam.grad.zero_()

1.7 执行训练

查看执行训练的过程,学习率为每次 移动的步长,batch_size 为每次训练输出的数据量,num_epochs 为训练迭代过程:

1 计算每次的损失值。

2 反向传播计算梯度,就是计算权重实时的导数。

3 根据实时的梯度更新权重值。

lr = 0.01  # 学习率
batch_size = 100   # 每次训练数据输出数据量
num_epochs = 1000   # 训练次数for epoch in range(num_epochs):for feature, label in data_iter(batch_size, X, y):l = squared_loss(linreg(feature, w, b), label)   # 计算损失print(f'epoch:{epoch:3}, [w, b]: [{w[0].item():.5f},{w[1].item():.5f},{b.item():.5f}], loss:{l.mean():.5f}')l.sum().backward()   # 反向传播计算 w,b 的实时梯度sgd([w, b], lr, batch_size)   # 更新w,b

原始公式:

y = 2x_1 - 3.4x_2 + 4.2

可以看出 训练到后期,w1,w2,b的值和原始生成数据的公式基本吻合

二 简洁实现线性回归(调包)

数据集生成:

import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2ltrue_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): #@save"""构造一个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)

 查看下数据,注意这里数据加载使用了 load_array

next(iter(data_iter))

a 定义模型

# nn是神经网络的缩写
from torch import nn
net = nn.Sequential(nn.Linear(2, 1))
net
# Sequential(
#   (0): Linear(in_features=2, out_features=1, bias=True)
# )

b 初始化权重

net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
# tensor([0.])

c 定义损失函数

loss = nn.MSELoss()

d 定义优化算法

trainer = torch.optim.SGD(net.parameters(), lr=0.03)
trainer

f 执行训练

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}')

查看计算的最后结果:

w = net[0].weight.data
print(f'w: {w.reshape(true_w.shape)},w误差:', true_w-w.reshape(true_w.shape))
b = net[0].bias.data
print(f'b: {b.item():.5f}, b的误差:', true_b - b)# w: tensor([ 2.0003, -3.3999]),w误差: tensor([-3.0398e-04, -7.4625e-05])
# b: 4.19952, b的误差: tensor([0.0005])

原始公式:

y = 2x_1 - 3.4x_2 + 4.2


三 线性回归 其他相关知识

线性模型的四个模块:训练数据,线性模型,损失函数,优化算法

a. 数据集

使用房价预测数据集,我们希望根据房屋的面积和房龄等来估算房屋价格。

b. 线性模型

预测公式, 价格 = 权重1 * 面积 + 权重2 * 房龄 + 截距:

c. 损失函数

拟合最小二乘法,使用平方误差:

在训练模型时,我们希望寻找一组参数(w∗ , b∗),这组参数能 最小化在所有训练样本上的总损失 

线性回归的解可以用一个公式简单地表达出来,这类解叫作解析解(analytical solution)。

        w^* = (X^TX)^{-1}X^Ty

d. 优化算法

梯度下降最简单的用法是 计算损失函数(数据集中所有样本的损失均值)关于模型参数的导数(在这里也可 以称为梯度)。但实际中的执行可能会非常慢:因为在每一次更新参数之前,我们必须遍历整个数据集。因此, 我们通常会在 每次需要计算更新的时候随机抽取一小批样本,这种变体叫做小批量随机梯度下降(minibatch stochastic gradient descent)。

给定特征估计目标的过程通常称为预测(prediction)或推断(inference)

3.1 矢量化加速

定义计时器,用来 查看算法运行时间:

%matplotlib inline
import mathimport time
import numpy as np
import torch
from d2l import torch as d2l
class Timer: #@save"""记录多次运行时间"""def __init__(self):self.times = []self.start()def start(self):"""启动计时器"""self.tik = time.time()def stop(self):"""停止计时器并将时间记录在列表中"""self.times.append(time.time() - self.tik)return self.times[-1]def avg(self):"""返回平均时间"""return sum(self.times) / len(self.times)def sum(self):"""返回时间总和"""return sum(self.times)def cumsum(self):"""返回累计时间"""return np.array(self.times).cumsum().tolist()

查看 for 循环时长:

n = 100000
a = torch.ones([n])
b = torch.ones([n])c = torch.zeros(n)  # 初始化
timer = Timer()
for i in range(n):c[i] = a[i] + b[i]
print(f'{timer.stop():.5f} 秒')  # 0.51397 秒

查看 直接计算 时长:

timer.start()
d = a + b
print(f'{timer.stop():.5f} 秒')  # 0.00100 秒

使用向量计算,本次计算优化了 500倍。for 循环画了0.5 秒,而直接计算 只花了 0.001秒!!!

3.2 正态分布

查看 不同均值和方差的正态分布 情况:

def normal(x, mu, sigma):p = 1 / math.sqrt(2 * math.pi * sigma**2)return p * np.exp(-0.5 / sigma**2 * (x - mu)**2)
# 再次使用numpy进行可视化
x = np.arange(-8, 8, 0.01)
# 均值和标准差对
params = [(0, 1), (0, 2), (3, 1)]
d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabel='x',ylabel='p(x)', figsize=(6, 4),legend=[f'mean {mu}, std {sigma}' for mu, sigma in params])

尽管神经网络涵盖了更多更为丰富的模型,我们依然可以用描述神经网络的方式来描述线性模型,从而把 线性模型看作一个神经网络。其实深度神经网络就是成千上万个线性模型组成的一个整体,神经网络里面我们会把输入的每一个特征都去计算一个权重。

对于线性回归,每个输入都与每个输出相连,我们将这种变换称为 全连接层(fully‐connected layer)或称为稠密层(dense layer)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的餐饮管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Java学习笔记21——使用JDBC访问MySQL数据库

JDBC(Java Database Connectivity,Java数据库连接)是应用程序编程借口(API),描述了一套访问关系数据库的标准Java类库。可以在程序中使用这些API,连接到关系数据库,执行SQL语句&…

IDEA Git恢复DropCommit删除的提交

刚刚Dorp commit了,本地代码也被删除了,如何恢复呢, 从项目中登录git,找到刚刚的commit代码,如下所示:输入命令git reflog 复制代码,到idea中,打开GIt,找到RESET HEAD, …

初始 Navicat BI 工具

早前,海外 LearnBI online 博主 Adam Finer 对 Navicat Charts Creator 这款 BI(商业智能)工具进行了真实的测评。今天,我们来看下他对 Navicat BI 工具的初始之感,希望这能给用户一些启发与建议。LearnBI online 作为…

《计算机考研精炼1000题》为你考研之路保驾护航

创作背景 在这个充满挑战与竞争的时代,每一位考生在备战研究生考试的过程中,都希望通过更多符合考纲要求的练习题来提高自己的知识和技能。为了满足这一需求,我们精心策划和编辑了这本《计算机考研精炼1000题》。在考研政治和考研数学领域&a…

springboot283图书商城管理系统

图书商城管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理…

耳机壳UV树脂制作私模定制耳塞需要什么样的设备和技术?

制作私模定制耳塞需要使用到一些特定的设备和技术,包括但不限于以下内容: 耳模制作工具:用于获取用户耳型的耳模制作工具,如硅胶、橡皮泥等。需要使用熟练的手法和技术,确保耳模的准确性和稳定性。UV树脂:…

社交变革:探索Facebook的魔力

社交媒体平台的崛起已经改变了我们与世界的交互方式,而Facebook作为其中的巨头,其影响力和魔力更是不可忽视。本文将深入探讨Facebook如何引领社交变革,并探索其背后的魔力所在。 连接世界的纽带 Facebook的独特之处在于它作为一个社交平台&…

「滚雪球学Java」:安全(章节汇总)

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!&#xf…

【视频异常检测】Diversity-Measurable Anomaly Detection 论文阅读

Diversity-Measurable Anomaly Detection 论文阅读 Abstract1. Introduction2. Related Work3. Diversity-Measurable Anomaly Detection3.1. The framework3.2. Information compression module3.3. Pyramid deformation module3.4. Foreground-background selection3.5. Trai…

JavaScript实现简单的表单验证

关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

ChatGPT在大气科学领域建模、数据分析、可视化与资源评估中的高效应用及论文写作

深度探讨人工智能在大气科学中的应用&#xff0c;特别是如何结合最新AI模型与Python技术处理和分析气候数据。课程介绍包括GPT-4等先进AI工具&#xff0c;旨在帮助学员掌握这些工具的功能及应用范围。课程内容覆盖使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等实战…

HTML案例-1.标签练习

效果 源码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…

物资管理系统建设方案

二、 项目概述 2.1 项目背景 2.2 现状分析 2.2.1 业务现状 2.2.2 系统现状 三、 总体需求 3.1 系统范围 3.2 系统功能 3.3 用户分析 3.4 假设与依赖关系 四、 功能需求 五、 非功能性需求 5.1 用户界面需求 5.2 软硬件环境需求 5.3 产品质量需求 5.4 接口需求 …

高效文件管理,批量复制文件夹名称 ,轻松提升工作效率

在信息爆炸的时代&#xff0c;电脑中的文件夹数量与日俱增&#xff0c;管理和整理这些文件夹成为一项繁琐的任务。您是否曾因为需要复制大量文件夹的名称而感到苦恼&#xff1f;现在&#xff0c;我们为您带来了一款能够一键批量复制文件夹名称的神奇工具&#xff0c;让您的效率…

在SAP BAS中创建你的第一个Fiori项目

1. 前言 本文将通过step by step的方式介绍如何在SAP Business Studio中创建一个Fiori项目&#xff0c;并通过Mock Data启动Fiori应用程序。 2. Demo Step1: 登录BAS并创建Dev Space Step2: 进入创建好的Dev Space&#xff0c;通过Get Started页面&#xff0c;选择New Projec…

STM32-DMA数据转运

DMA进行转运的条件 1&#xff1a;开关控制&#xff0c;DMA_CMD必须使能2&#xff1a;传输计数器必须大于03&#xff1a;触发源必须有触发的信号

Zookeeper(五)Zokeeper 环境搭建与Curator使用

目录 一 环境搭建1.1 单机环境搭建1.2 可视化工具ZooKeeper Assistant1.3 集群环境搭建 二 常用命令1.1 命令行语法1.2 数据节点信息1.3 节点类型 三 CuratorAPI使用3.1 依赖3.1 创建会话3.2 基本使用增删改查3.3 ACL权限控制3.4 分布式锁3.5 分布式计数器3.6 分布式Barrier3.7…

婴儿洗衣机硬核测评:希亦、鲸立、小吉婴儿洗衣机性能大比拼!

如果你非常注重婴儿衣物的卫生问题&#xff0c;那么婴儿洗衣机则是非常理想的选择。毕竟&#xff0c;在婴儿吃奶或者接触其他材料时&#xff0c;其抵抗力是比较弱的&#xff0c;再加上普通洗衣机无法对婴儿的衣物进行有效的消毒处理&#xff0c;轻则会对婴儿的健康造成威胁&…

基于 HBase Phoenix 构建实时数仓(5)—— 用 Kafka Connect 做实时数据同步

目录 一、总体架构 二、安装配置 MySQL 1. 创建 mysql 用户 2. 建立 MySQL 使用的目录 3. 解压安装包 4. 配置环境变量 5. 创建 MySQL 配置文件 6. MySQL 系统初始化 7. 启动 mysql 服务器 8. 创建 dba 用户 三、配置 MySQL 主从复制 四、安装部署 Kafka Connector…