【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 torchx_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_predmodel = 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 pltdata_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_retnp_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_yepoch = 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):breaklast_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.hqwc.cn/news/342145.html

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

相关文章

蓝桥杯省赛无忧 STL 课件14 stack

01 stack的定义和结构 stack是一种后进先出&#xff08;LIFO&#xff09;的数据结构&#xff0c;使用前需要包含头文件。 stack提供了一组函数来操作和访问元素&#xff0c;但它的功能相对较简单。 stack的定义和结构如下&#xff08;仅作了解即可&#xff09;&#xff1a; t…

喜讯!云起无垠入选2023年度中国数字安全能力图谱

近日&#xff0c;国内权威的数字化领域第三方服务机构数世咨询发布了“2023年度中国数字安全能力图谱&#xff08;精选版&#xff09;”&#xff0c;该图谱旨在帮助行业用户深入了解当前数字安全产业现状&#xff0c;并为其数字安全能力建设提供有力参考。云起无垠凭借卓越的技…

面试算法116:朋友圈

题目 假设一个班级中有n个学生。学生之间有些是朋友&#xff0c;有些不是。朋友关系是可以传递的。例如&#xff0c;A是B的直接朋友&#xff0c;B是C的直接朋友&#xff0c;那么A是C的间接朋友。定义朋友圈就是一组直接朋友或间接朋友的学生。输入一个nn的矩阵M表示班上的朋友…

直播美颜SDK开发指南:美颜功能设计

直播美颜技术对于提升用户满意度和吸引观众至关重要。本文将深入探讨直播美颜SDK的开发指南&#xff0c;聚焦于美颜功能的设计与实现。 一、美颜功能的重要性 直播美颜功能不仅仅是为了满足用户的虚荣心&#xff0c;更是为了提升用户的自信心和直播质量。一个优秀的美颜功能能…

【linux基础I/O(二)】文件系统讲解以及文件缓冲区的概念

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 基础I/O 1. 前言2. 理解C语言…

【抓包教程】BurpSuite联动雷电模拟器——安卓高版本抓包移动应用教程

前言 近期找到了最适合自己的高版本安卓版本移动应用抓HTTP协议数据包教程&#xff0c;解决了安卓低版本的问题&#xff0c;同时用最简单的办法抓到https的数据包&#xff0c;特此进行文字记录和视频记录。 前期准备 抓包工具&#xff1a;BurpSuite安卓模拟器&#xff1a;雷…

第8章-第2节-Java中IO流的简单介绍

1、什么是流 我们可以先想象水流是怎样的&#xff1f;溪水不断流动&#xff0c;最终融入大海&#xff1b;我们今天的学习IO其实如同水流一样&#xff0c;当我们读取文件信息或者写入信息时&#xff0c;如同水流一样&#xff0c;不断读取或者写入&#xff0c;直到业务流程结束。…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例3-1 CSS3过渡

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>CSS3 过渡</title> <style> /*显示*/ .box {width: 100px;height: 100px;background-color: #eee;/*透明度*/opacity: 1;/*过渡*/transition: 3s; } /…

软件分发点(DP)的合理规划

软件分发点&#xff08;Distribution Point, DP&#xff09;是用于托管文件以分发到计算机和移动设的服务器&#xff0c;Jamf Pro可以通过分发点分发以下类型的文件&#xff1a; 软件包 脚本 内部应用程序 内部书籍 Jamf Pro支持两种类型的分发点&#xff0c;您可以使用这些类型…

怎么挑选一体化污水处理设备

选择一体化污水处理设备是一个关键决策&#xff0c;它直接影响到污水处理系统的效能和运行成本。随着环保意识的日益提高&#xff0c;各种污水处理设备也不断地涌现出来。那么&#xff0c;在众多选项中&#xff0c;如何挑选一体化污水处理设备&#xff1f;本文将为您提供一些建…

leetcode17 电话号码的字母组合

方法1 if-else方法 if-else方法的思路及其简单粗暴&#xff0c;如下图所示&#xff0c;以数字234为例&#xff0c;数字2所对应的字母是abc&#xff0c;数字3所对应的是def&#xff0c;数字4所对应的是ghi&#xff0c;最后所产生的结果就类似于我们中学所学过的树状图一样&…

《共建开源》系列:Airtest-Framework - UI自动化框架系统

Airtest- Framework 平台简介 Airtest- Framework 是 基于 unittest、Flask、Airtest 搭建的 开源的 UI 自动化框架系统 提供 HTTP API 接口&#xff0c;实现自动解析包名并自动执行 相应目录下的 Case。目前仅支持单台设备连接。多个任务会自动排队处理。 系统要求 Pytho…