【pytorch】使用pytorch构建线性回归模型-了解计算图和自动梯度

使用pytorch构建线性回归模型

线性方程的一般形式

请添加图片描述

衡量线性损失的一般形式-均方误差

请添加图片描述

pytorch中计算图的作用和优势

在 PyTorch 中,计算图(Computational Graph)是一种用于表示神经网络运算的数据结构。每个节点代表一个操作,例如加法、乘法或激活函数,而边则代表这些操作之间的数据流动。

计算图的主要优点是可以自动进行微分计算。当你在计算图上调用 .backward() 方法时,PyTorch 会自动计算出所有变量的梯度。这是通过使用反向传播算法来实现的,该算法从最后的输出开始,然后根据链式法则回溯到输入。

以下是一个简单的计算图示例:

import torch

# 定义两个张量
x = torch.tensor([1.0], requires_grad=True)
y = torch.tensor([2.0], requires_grad=True)

# 定义计算图
z = x * y
out = z.mean()

# 计算梯度
out.backward()

print(x.grad) # tensor([0.5])
print(y.grad) # tensor([0.5])

在这个例子中,我们首先定义了两个需要求导的张量 xy。然后,我们定义了一个计算图,其中 zxy 的乘积,outz 的平均值。当我们调用 out.backward() 时,PyTorch 会自动计算出 xy 的梯度。

注意,只有那些设置了 requires_grad=True 的张量才会被跟踪并存储在计算图中。这样,我们就可以在需要时计算这些张量的梯度。

import torch

x_data = [1.0, 2.0, 3.0] #x输入,表示特征
y_data = [2.0, 4.0, 6.0] #y输入,表示标签

w = torch.tensor([1.0], requires_grad=True) #创建权重张量,启用自动计算梯度

def forward(x): #前向传播
    return x * w #特征和权重的点积,构建乘法计算图

def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2 #均方误差,构建损失计算图

线性模型的计算图的一般形式

请添加图片描述

print("predict before training is {}".format(forward(4).item()))

for epoch in range(100):
    for x,y in zip(x_data, y_data):#组合特征和标签
        l = loss(x,y) #定义计算图,包括前向传播和计算损失
        l.backward() #反向传播,计算梯度
        print("\tgrad:", x,y,w.grad.item())#梯度的标量
        w.data = w.data - 0.01 * w.grad.data#使用“.data”表示是更新数据,而不是创建计算图
        w.grad.data.zero_()#梯度清零,准备创建下一个计算图
    print("progress:", epoch, l.item())
print("predict after training:{}".format(forward(4).item()))

使用pytorch API

pytorch的张量计算
请添加图片描述

准备数据集

x_data = torch.tensor([[1.0],[2.0],[3.0]])
y_data = torch.tensor([[2.0],[4.0],[6.0]])

请添加图片描述

class LinearModel(torch.nn.Module):
    def __init__(self, *args, **kwargs) -> None:
        super(LinearModel, self).__init__(*args, **kwargs)
        self.linear = torch.nn.Linear(in_features=1, out_features=1)
        
    def forward(self, x):
        y_pred = self.linear(x)
                return y_pred
    
model = LinearModel()

定义损失函数和损失优化函数

关于小批量随机梯度下降

小批量随机梯度下降(Mini-batch Stochastic Gradient Descent)是批量梯度下降的一种变体。与批量梯度下降相比,小批量随机梯度下降在每次迭代时只使用一小部分数据(称为小批量)来计算梯度,然后根据这个梯度来更新模型的参数。

小批量随机梯度下降的目标函数为:

J ( θ ) = 1 m ∑ i = 1 m L ( y ( i ) , f θ ( x ( i ) ) ) J(\theta) = \frac{1}{m} \sum_{i=1}^{m} L(y^{(i)}, f_{\theta}(x^{(i)})) J(θ)=m1i=1mL(y(i),fθ(x(i)))

其中, J ( θ ) J(\theta) J(θ) 是目标函数, m m m 是数据集的大小, L ( y ( i ) , f θ ( x ( i ) ) ) L(y^{(i)}, f_{\theta}(x^{(i)})) L(y(i),fθ(x(i))) 是第 i i i 个样本的损失函数, f θ ( x ( i ) ) f_{\theta}(x^{(i)}) fθ(x(i)) 是模型对第 i i i 个样本的预测。

小批量随机梯度下降的更新规则为:

θ = θ − α ∇ J ( θ ) \theta = \theta - \alpha \nabla J(\theta) θ=θαJ(θ)

其中, α \alpha α 是学习率, ∇ J ( θ ) \nabla J(\theta) J(θ) 是目标函数关于 θ \theta θ 的梯度。

小批量随机梯度下降的优点是它结合了批量梯度下降的优点(即可以利用整个数据集的信息来更新参数)和随机梯度下降的优点(即可以在每次迭代时使用新的数据)。这使得它在处理大规模数据集时具有更好的计算效率,同时也能避免随机梯度下降的问题(即可能会陷入局部最优)。

criteria = torch.nn.MSELoss()#使用均方误差做损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)#使用随机梯度下降做损失优化函数
for epoch in range(1000):
    y_pred = model(x_data)
    loss = criteria(y_pred, y_data)
    print(epoch, loss)
    optimizer.zero_grad()#梯度清零
    loss.backward()#反向传播
    optimizer.step()#梯度下降更新参数

预测

print("w=", model.linear.weight.item())
print("b=", model.linear.bias.item())

x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print("y_pred=", y_test.data)
print("w=", model.linear.weight.item())
print("b=", model.linear.bias.item())

实践

使用pytorch创建线性模型进行波士顿房价预测(数据集可以自行下载)

import pandas as pd
import numpy as np
import torch
import matplotlib.pyplot as plt

data_file = "J:\\MachineLearning\\数据集\\housing.data"

pd_data = pd.read_csv(data_file, sep="\s+")

def prepare_data(data, normalize_data=True):    
    # 标准化特征矩阵(可选)    
    if normalize_data:    
        features_mean = np.mean(data, axis=0)    #特征的平均值
        features_dev = np.std(data, axis=0)      #特征的标准偏差
        features_ret = (data - features_mean) / features_dev    #标准化数据
    else:    
        features_mean = None    
        features_dev = None   
    return features_ret

np_data = pd_data.sample(frac=1).reset_index(drop=True).values
#bias = np.ones(len(np_data)).reshape(-1,1)
#np_data = np.concatenate((bias, np_data), axis=1)
train_data = np_data[:int(len(np_data)*0.8), :]

test_data = np_data[int(len(np_data)*0.8):, :]
train_dataset = train_data[:, :-1]
test_dataset = test_data[:, :-1]
train_labels = train_data[:, -1]
test_labels = test_data[:, -1]
train_dataset = prepare_data(train_dataset)
# Save the mean and standard deviation of the target variable before normalization
target_mean = np.mean(train_labels)
target_dev = np.std(train_labels)

print(np_data.shape)
print(train_data.shape)
print(train_dataset.shape)
print(train_labels.shape)

features = torch.tensor(train_dataset, dtype=torch.float32)
print(features[:10])
feature_num = features.shape[1]
labels = torch.tensor(train_labels.reshape(-1,1), dtype=torch.float32)

print(features.shape)
print(labels.shape)

class LinearReg(torch.nn.Module):
    def __init__(self, *args, **kwargs) -> None:
        super(LinearReg, self).__init__(*args, **kwargs)
        self.linear_reg = torch.nn.Linear(in_features=feature_num, out_features=1)
        
    def forward(self, x):
        pred_y = self.linear_reg(x)
        return pred_y

epoch = 100000
lr = 0.001
linear_model = LinearReg()
loss_function = torch.nn.MSELoss(size_average=True)
optimizer = torch.optim.SGD(linear_model.parameters(), lr)

loss_history = []
last_loss = 0.01
for epoch_step in range(epoch):
    predict = linear_model(features)
    loss = loss_function(predict, labels)
    if (epoch_step % 100 == 0):
        print(epoch_step, loss)
        loss_history.append(loss.item())
        if (abs(float(loss.item()) - last_loss)/last_loss < 0.00001):
            break
        last_loss = float(loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
plt.plot(loss_history)
plt.show()
test_dataset = prepare_data(test_dataset)
test_dataset = torch.tensor(test_dataset, dtype=torch.float32)
result = linear_model(test_dataset).detach().numpy()
predicted_values = np.round(result, 2)
print(predicted_values)
show_result = np.concatenate((predicted_values.reshape(-1,1), test_labels.reshape(-1,1)), axis=1)
print(show_result)
print(predicted_values)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

报错:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver

记一次关于驱动报错的问题 背景 原始驱动版本515&#xff0c;cuda 11.5.。 要将cuda 版本升级到11.7 内容 我去nvidia官网下载了 11.7.1的cuda tools nvidia CUDA 下载。 按照步骤安装后&#xff0c;执行nvcc -V ,可以看到已经正常更新 但是执行 nvidia-smi 时报错 NVIDIA…

67.网游逆向分析与插件开发-角色数据的获取-分析角色数据基址

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;角色类的数据分析与C还原-CSDN博客 基址这个东西说好找也好找&#xff0c;说不好找是真找不着&#xff0c;但就根据一个原则&#xff0c;就是确认这个东西有基址还是没基址&#xff0c;为什么会有没基…

专搞大厂?免费开源?这个小工具我相信很多人需要!

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; XHS-Downloader v1.6是一款功能齐全的免费开源工具&#xff0c;它使用Python Requests库开发而成&#xff0c;用于采集和下载X红S作品。该工具具备多…

thinkphp美容SPA管理系统源码带文字安装教程

thinkphp美容SPA管理系统源码带文字安装教程 运行环境 服务器宝塔面板 PHP 7.0 Mysql 5.5及以上版本 Linux Centos7以上 基于thinkphp3.23B-JUI1.2开发&#xff0c;权限运用了Auth类认证&#xff0c;权限可以细分到每个功能&#xff0c; 增删改查功能一应俱全&#xff0c;整合了…

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)四

第三部分、栈(Stack)和队列(Queue)详解 栈和队列&#xff0c;严格意义上来说&#xff0c;也属于线性表&#xff0c;因为它们也都用于存储逻辑关系为 "一对一" 的数据&#xff0c;但由于它们比较特殊&#xff0c;因此将其单独作为一章&#xff0c;做重点讲解。 使用栈…

突然又对 Go 感兴趣,GOPATH entry cannot start with shell metacharacter 错误

打发无聊时间&#xff0c;水文一篇&#xff5e; 事情是这样的&#xff0c;因为我们上架的渠道包基本是定制化混淆出包&#xff0c; 混淆出包有一个关键点就是指定映射文件&#xff0c;映射文件的内容有一部分是使用外部工具在打包前按照一定规律随机生成包名、类名&#xff0c…

Webhook端口中的自定义签名身份认证

概述 如果需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能对于安全性有着较高的要求&#xff0c;而不仅仅是用于验证入站 Webhook 要求的基本身份验证用户名/密码&#xff0c;或者用户可能只想在入站 Webhook 消息上增加额外的安全层。 使用 Webhook…

occNeRF:使用神经辐射场进行多摄像头自监督占据预测

文章&#xff1a;OccNeRF: Self-Supervised Multi-Camera Occupancy Prediction with Neural Radiance Fields 作者&#xff1a;Chubin Zhang, Juncheng Yan , Yi Wei ,Jiaxin Li, Li Liu, Yansong Tang , Yueqi Duan, Jiwen Lu 编辑&#xff1a;点云PCL 欢迎各位加入知识星…

并发前置知识二:多线程不安全的本质

一、前言 这些年&#xff0c;我们的cpu、内存和i/o设备都在不断迭代&#xff0c;不断朝着更快的方向努力。但是&#xff0c;在这个快速发展的过程中&#xff0c;有一个核心矛盾一直存在&#xff0c;就是这三者的速度。 cpu是天上1天&#xff0c;内存是地上1年cpu是天上1天&am…

配电柜监测:别再人工巡检!一文讲透!

随着现代社会对电力的依赖性不断增强&#xff0c;各行各业对电力系统的可靠性和安全性提出了更高的要求。 配电柜作为电力系统的核心组成部分&#xff0c;其监控与管理显得尤为重要。为了满足企业对电力系统监测的需求&#xff0c;配电柜监控系统应运而生。 客户案例 制造企业…

ASP .net core微服务实战(杨中科)

背景&#xff1a; 主要是思考下&#xff0c;我们为什么要用微服务&#xff1f; 微服务我现在理解是&#xff1a;提供了我们一种模块化的手段&#xff0c;一个服务负责一种类型的业务&#xff0c;是一种面对复杂问题进行拆分的方式&#xff0c;但是也会引入一些中间件&#xf…

视频智能分析/边缘计算AI智能分析网关V4区域入侵检测算法如何配置?

边缘计算AI智能分析网关&#xff08;V4版&#xff09;部署了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;并上报识别结果&#xff0c;并能进行语音告警播放。算法配置后&#xff0c;即可对监控视频流进行实时检测&#xf…

2024.1.8 Day04_SparkCore_homeWork

目录 1. 简述Spark持久化中缓存和checkpoint检查点的区别 2 . 如何使用缓存和检查点? 3 . 代码题 浏览器Nginx案例 先进行数据清洗,做后续需求用 1、需求一&#xff1a;点击最多的前10个网站域名 2、需求二&#xff1a;用户最喜欢点击的页面排序TOP10 3、需求三&#x…

制造知识普及--MES系统中的调度排产管理

要想弄清楚MES系统调度排产的管理机制&#xff0c;则要首先搞清楚车间调度排产是一套怎样的工作流程&#xff0c;它的难点在什么地方&#xff1f; 生产调度指的是具体组织实现生产作业计划的工作&#xff0c;是对执行生产作业计划过程中发生的问题和可能出现的问题&#xff0c…

PingCAP 受邀参加 FICC 2023,获 Open100 世纪全球开源贡献奖

2023 年 12 月&#xff0c;2023 国际测试委员会智能计算与芯片联邦大会&#xff08;FICC 2023&#xff09;在海南三亚举办&#xff0c;中外院士和数十位领域专家莅临出席。 大会现场 &#xff0c;开放源代码促进会创始人 Bruce Perens 颁发了 Open100 世纪全球开源贡献奖&…

WXUI 基于uni-app x开发的高性能混合UI库

uni-app x 是什么&#xff1f; uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一个跨平台应用开发引擎。 uni-app x 没有使用js和webview&#xff0c;它基于 uts 语言。在App端&#xff0c;uts在iOS编译为swift、在Android编译为kotlin&#xff0c;完全达到了原生应用…

GPT Store,是否会成为下一个App Store?

经历了一场风波后&#xff0c;原本计划推出的GPT Store终于成功上线。OpenAI在北京时间1月11日推出了GPT Store&#xff0c;被广泛视为类似于苹果的"App Store"&#xff0c;为人工智能应用生态系统迈出了重要一步。然而&#xff0c;OpenAI要想将GPT Store打造成苹果般…

vue知识-05

聊天室案例(django接口) # chat.hetm<<script src"/static/axios.js"></script><script src"/static/vue.js"></script><body> <div id"app"><h1>聊天室</h1><button click"handleS…

YOLOv8涨点改进:多层次特征融合(SDI),小目标涨点明显,| UNet v2,比UNet显存占用更少、参数更少

💡💡💡本文独家改进:多层次特征融合(SDI),能够显著提升不同尺度和小目标的识别率 如何引入到YOLOv8 1)替代原始的Concat; 💡💡💡Yolov8魔术师,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你…

汽车级线性电压稳压器LM317MBSTT3G:新能源汽车的理想之选

LM317MBSTT3G是一款可调三端子正向线性稳压器&#xff0c;能够在 1.2 V 至 37 V 的输出电压范围内提供 500 mA 以上的电流。此线性电压稳压器使用非常简便&#xff0c;仅需两个外部电阻即可设置输出电压。另外&#xff0c;它采用内部电流限制、高温关断和安全区域补偿&#xff…