使用torch解决线性回归问题

  1. 数据处理

import torch
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltdata=pd.read_csv('./datasets/Income1.csv') #数据准备data.head(5)#展示数据
#以上所有的代码都是用jupyter notebook写,形成了阶段性的结果展示

查看数据信息
data.info()

绘制数据的散点图
plt.scatter(data.Education,data.Income) #绘制散点图
plt.xlabel('Education')
plt.ylabel('Income')
plt.show()

数据转换
X=torch.from_numpy(data.Education.to_numpy().reshape(-1,1)).type(torch.FloatTensor)
Y=torch.from_numpy(data.Income.to_numpy().reshape(-1,1)).type(torch.FloatTensor)

上面一行代码首先通过data.Education获取受教育年限这一列,使用to_numpy()方法将其转换为ndarrray数组形式,然后使用reshape方法将其形状设置为二维数组,并且将最后一个维度明确为1。

展示数据的形状
print(X.size(),Y.size())

查看数据集的形状如上图所示,目前数据集是二维的,最后一个维度为1,代表单条数据的长度,前面的30代表数据的个数,所以X和Y这两个数据集的形状可以理解为输入X是30个长度为1的数据,输出Y也是30个长度为1的数据。

模型建立与数据训练

编写训练类
from torch import nn #nn.Module是PyTorch的高阶APIclass EIModel(nn.Module):def __init__(self):super(EIModel,self).__init__()   #继承父类的属性 重写init的方法有两种  一.super(子类,self).__init__() 二.父类.__init__(self)self.linear=nn.Linear(in_features=1,out_features=1)#创建线性层def forward(self,inputs):logits=self.linear(inputs)   #在输入上调用初始化的线性层return logits

因为当前模型是一个简单的线性回归模型,只有w和b两个参数,在__init__()方法中,使用nn.Linear()方法初始化一个线性连接层,nn.Linear有两个参数,即in_features和out_features,分别代表输入和输出维度的大小,根据X和Y的size()方法,我们可以输入和输出的维度大小都为1.

创建EIModel对象
model=EIModel() #创建一个ETModel对象

这里的模型就是一个最简单的线性层,也就是所谓的一个线性函数,只有w和b两个参数,接下来是我们定义计算损失函数,并且根据损失值进行梯度优化,优化模型参数

构建损失函数
loss_fn=nn.MSELoss()   #定义了均方误差损失来计算损失函数
opt=torch.optim.SGD(model.parameters(),lr=0.0001)  #初始化一个优化器

第一行代码就是用了PyTorch中内置的均方误差来计算损失函数,第二行初始化了一个内置的优化器,第一个参数为需要优化的变量,通过model.parameters()方法可以获取模型中的所有变量,优化器中参数lr为学习率,也就是在计算梯度时用到的alpha。

迭代训练
for epoch in range(5000):         #对全部的数据训练5000次for x,y in zip(X,Y):          #同时对X和Y迭代y_pred=model(x)           #调用model得到预测输出y_predloss=loss_fn(y_pred,y)    #根据模型预测输出与实际的值y计算损失opt.zero_grad()           #将累计的梯度置为0loss.backward()           #反向传播损失,计算损失与模型参数之间的梯度opt.step()                #根据计算得到梯度优化模型参数
print("Down!")

模型训练代码有一行opt.zero_grad(),是因为PyTorch会累计每次计算的梯度,使用此代码将上一循环中计算的梯度置为0

展示参数
print(list(model.named_parameters()))#以生成器的形式返回模型参数的名称和值

模型效果展示
#绘制原数据分布的散点图
plt.scatter(data.Education,data.Income,label='real data')
#用我们训练出来的参数,来绘制直线
plt.plot(X,model(X).detach().numpy(),c='r',label='predict line')
plt.xlabel('Education')#设置x轴的标签
plt.ylabel('Income')#设置y轴的标签
plt.legend()#可以显示图例
plt.show()

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

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

相关文章

FFmpeg-基础组件-AVFrame

本章主要介绍FFmpeg基础组件AVFrame. 文章目录 1.结构体成员2.成员函数AVFrame Host内存的获取 av_frame_get_bufferAVFrame device内存获取av_hwframe_get_buffer() 1.结构体成员 我们把所有的代码先粘贴上来,在后边一个一个解释。 typede…

编程实战:自己编写HTTP服务器(系列4:查看文件、下载等一般功能)

系列入口:编程实战:自己编写HTTP服务器(系列1:概述和应答)-CSDN博客 本文介绍各种功能的实现。大部分是特定内置入口。 目录 一、默认页 二、查看文件 三、关闭服务 四、下载页面 一、默认页 前面在已经介绍过重定…

【NR技术】NR NG-RAN整体架构 -功能划分(三)

1 概述 NG-RAN节点包括: gNB,向终端提供NR用户平面和控制平面协议终端;ng-eNB,向终端提供E-UTRA用户平面和控制平面的协议终端。gNB和ng- eNB通过Xn接口相互连接。gnb和NG- eNB也通过NG接口连接到5GC,更具体地说,通过NG-C接口连…

我心目中的杰出工程师

参考原文:The difference between good and great engineers 在工程师成长的这条路上,我从普通工程师 → 高级工程师 → 技术专家 → 技术管理 → 技术总监,一路走来,对何为杰出工程师是一直在思考和追寻的。如今我在公司培养工程…

做校园外卖平台需要多少人?高校点外卖难题能否快速解决?

众所周知,大学生喜欢订外卖。到饭点前提前下单,下课后不用挤食堂,这种“懒人经济”在校园商圈非常流行,学生对外卖和跑腿等服务的依赖越来越深,外卖需求也在不断增加。但毕竟是在学校,环境因素会影响外卖的…

MongoDB在Windows系统和Linux系统中实现自动定时备份

本文主要介绍MongoDB在Windows系统和Linux系统中如何实现自动定时备份。 目录 MongoDB在Windows系统中实现自动定时备份MongoDB在Linux系统中实现自动定时备份备份步骤备份恢复 MongoDB在Windows系统中实现自动定时备份 要在Windows系统中实现自动定时备份MongoDB数据库&#…

王小二切饼(递归练习)

题目名字 王小二切饼 题目链接 题意 要切饼,每一刀都要切的使这个饼分的最多 思路 先列举一下第1,2,3,4…刀最多能切多少块 首先要确保每新切的一刀都与原来的所有刀有交点,这样就能分出最大块数然后找出规律因为第…

酷开科技多维度赋能营销,实力斩获三项大奖

在数智化新阶段、广告新生态、传播新业态的背景下,“第30届中国国际广告节广告主盛典暨网易传媒态度营销峰会”于11月18日在厦门国际会展中心盛大举行。来自全国的品牌方、战略决策者、媒体平台和品牌服务机构等汇聚一堂。在50000+现场观众和数千万线上观…

MySQL InnoDB Replication部署方案与实践

1. 概述 MySQL Innodb ReplicaSet 是 MySQL 团队在 2020 年推出的一款产品,用来帮助用户快速部署和管理主从复制,在数据库层仍然使用的是主从复制技术。 ReplicaSet 主要包含三个组件:MySQL Router、MySQL Server 以及 MySQL Shell 高级客户…

HeartBeat监控Redis状态

目录 一、概述 二、 安装部署 三、配置 四、启动服务 五、查看数据 一、概述 使用heartbeat可以实现在kibana界面对redis服务存活状态进行观察,如有必要,也可在服务宕机后立即向相关人员发送邮件通知 二、 安装部署 参照文章:HeartBeat监…

web服务器之——搭建两个基于不同端口访问的网站

要求如下: 建立一个使用web服务器默认端口的网站,设置DocumentRoot为/www/port/80,网页内容为:the port is 80。建立一个使用10000端口的网站,设置DocumentRoot为/www/port/10000,网页内容为:t…

总结6种@Transactional注解的失效场景

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 引言 昨天有粉丝咨询了…