PyTorch深度学习(二)【反向传播、用pytorch实现线性回归】

news2025/1/11 18:40:45

反向传播

弄一个简单点的,两层的神经网络:

加入激活函数:(不加激活函数的神经网络就是一个线性回归模型)

用到的损失函数:

pytorch里面的数据存储:tensor,它可以存标量、向量、矩阵、高维度数据等。

所有的数值都保存在tensor里面,data和grad分别用来保存权重本身的值和损失函数对权重的导数。

定义好了tensor,就可以建立计算图了。

代码:

import torchx_data = [1.0, 2.0, 3.0]   #构建数据集y_data = [2.0, 4.0, 6.0]   #(1.0,2.0)是一个样本,(2.0,4.0)是一个样本,以此类推w = torch.tensor([1.0])  # w的初值为1.0,一定要用中括号给他括起来w.requires_grad = True   # 需要计算梯度。默认的tensor创建后是不需要计算梯度的,所以在计算的时候,构建的计算图里面不会保留计算关于当前的w的梯度,只有在设置为true的时候才会计算def forward(x):return x * w  # w是一个Tensor,所以当它遇到乘法运算的时候,这个运算符实际上已经被重载了,它要进行的就是tensor与tensor之间的数乘#重载就是说一个运算符有多个功能,但是作用的对象不同#构建计算图def loss(x, y):   #计算损失    y_pred = forward(x)return (y_pred - y) ** 2print("predict (before training)", 4, forward(4).item())for epoch in range(100):  #数据准备,训练100轮for x, y in zip(x_data, y_data):  #随机梯度下降,每次把(x_data,y_data) zip 成一个样本        l = loss(x, y)  # l是一个张量,tensor主要是在建立计算图 forward, compute the loss(前馈过程,计算Loss)        l.backward()  # backward,compute grad for Tensor whose requires_grad set to True(反馈过程,调用backward函数,自动计算所有需要w计算梯度的对应的值)#计算出来的梯度会保存到前边设置的w中(就是“w = torch.tensor([1.0])”这一行)#存到w中了之后,这个计算图就被释放了。只要一做backward,计算图就被释放了,准备下一次的图#在下一次的loss中会创建出新的计算图        print('\tgrad:', x, y, w.grad.item()) #item,标量        w.data = w.data - 0.01 * w.grad.data  # 权重更新时,注意grad也是一个tensor(取所有张量的data来进行计算是不会建立计算图的)        w.grad.data.zero_()  # after update, remember set the grad to zero (把权重里面的梯度数据全部清零)    print('progress:', epoch, l.item())  # 取出loss使用l.item,不要直接使用l(l是tensor会构建计算图)print("predict (after training)", 4, forward(4).item())

练习:输入为二次的线性模型(如下图)

import numpy as npimport matplotlib.pyplot as pltimport torchx_data = [1.0,2.0,3.0]y_data = [2.0,4.0,6.0]w1 = torch.Tensor([1.0])#初始权值w1.requires_grad = True#计算梯度,默认是不计算的w2 = torch.Tensor([1.0])w2.requires_grad = Trueb = torch.Tensor([1.0])b.requires_grad = Truedef forward(x):return w1 * x**2 + w2 * x + bdef loss(x,y):#构建计算图    y_pred = forward(x)return (y_pred-y) **2print('Predict (befortraining)',4,forward(4))for epoch in range(100):    l = loss(1, 2)#为了在for循环之前定义l,以便之后的输出,无实际意义for x,y in zip(x_data,y_data):        l = loss(x, y)        l.backward()        print('\tgrad:',x,y,w1.grad.item(),w2.grad.item(),b.grad.item())        w1.data = w1.data - 0.01*w1.grad.data #注意这里的grad是一个tensor,所以要取他的data        w2.data = w2.data - 0.01 * w2.grad.data        b.data = b.data - 0.01 * b.grad.data        w1.grad.data.zero_() #释放之前计算的梯度        w2.grad.data.zero_()        b.grad.data.zero_()    print('Epoch:',epoch,l.item())print('Predict(after training)',4,forward(4).item())

用pytorch实现线性回归

四大步骤:准备数据集,设计模型,计算损失和定义优化器,训练周期。

代码:

import torch# prepare dataset# x,y是矩阵,3行1列 也就是说总共有3个数据,每个数据只有1个特征x_data = torch.tensor([[1.0], [2.0], [3.0]])       #1.0是第一行,2.0是第二行,3.0是第三行。3×1的矩阵y_data = torch.tensor([[2.0], [4.0], [6.0]])# design model using classclass LinearModel(torch.nn.Module):    #把模型定义为一个类(LinearModel),所有的模型都需要去继承自Module,因为Module这个类里面有很多的方法是需要在后续的模型训练中会用到的#这个类里面最少需要实现两个函数,第一个就是initial函数,也就是构造函数嘛;第二个就是forward函数(必须叫forward)def __init__(self):                #构造函数是用来在初始化对象的时候需要默认调用的函数        super(LinearModel, self).__init__()    #调用父类的构造,这步必须有# (1,1)是指输入x和输出y的特征维度,这里数据集中的x和y的特征都是1维的# 该线性层需要学习的参数是w和b  获取w/b的方式分别是~linear.weight/linear.bias        self.linear = torch.nn.Linear(1, 1)  #使用torch.nn.Linear,这个是pytorch里面的类,类里面加括号,实际上就是在构造对象,包含了w(权重)和b(偏置)#此处的Linear也是继承自Module的,所以它能够自动的进行反向传播;linear是对象;nn是缩写:Neural Network(神经网络)def forward(self, x):             #forward是在进行前馈的过程中所要执行的计算。这里没有backward,因为用Module构造的出来的对象,这种对象会自动的根据计算图去实现backward的过程        y_pred = self.linear(x)       #求y^,函数后面加括号,可调用对象;x是3×1的矩阵return y_predmodel = LinearModel()    #实例化# construct loss and optimizer# criterion = torch.nn.MSELoss(size_average = False)   #size_average默认是false,不求均值criterion = torch.nn.MSELoss(reduction='sum')   #构造损失函数。MSELoss也是继承自nn.Moduleoptimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # model.parameters()自动完成参数的初始化操作;定义优化器#优化器不会构建计算图;parameters会检查Module里面的所有成员,如果成员里面有相应的权重,就会把这些加到要训练的参数集合上# training cycle forward, backward, updatefor epoch in range(1000):    y_pred = model(x_data)  # forward:predict   前馈里面算y^,把x_data算进去    loss = criterion(y_pred, y_data)  # forward: loss  算损失    print(epoch, loss.item())   #loss是标量    optimizer.zero_grad()  # the grad computer by .backward() will be accumulated. so before backward, remember set the grad to zero#梯度归零    loss.backward()  # backward: autograd,自动计算梯度    optimizer.step()  # update 参数,即更新w和b的值;根据所有参数包含的梯度和学习率自动更新print('w = ', model.linear.weight.item())  #不加item的话,就是一个矩阵print('b = ', model.linear.bias.item())#测试模型x_test = torch.tensor([[4.0]])  #1×1y_test = model(x_test)print('y_pred = ', y_test.data)  #输出也是1×1

当我们迭代1000次,得到的结果就会好一些:

同时,也要注意到这是有风险的。增加训练的轮数,对于训练的损失不断减少,测试集上的损失可能会少着少着就又回升了,说明过拟合了。

在真正的训练过程中,不仅要关注训练集上的损失,也要关注测试集上的损失。

不同的优化器可以去尝试,产生的损失会有差别:

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

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

相关文章

帝国EmpireCMS_7.5_SC_UTF8漏洞复现

一、漏洞说明 EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名 二、搭建环境 下载地址:http://www.phome.net/download/ 然后执行:http://127.0.0.1/EmpireCMS_7.5_SC_UTF8/upload/e/ins…

基于Levenberg-Marquardt算法的声源定位matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................................... %ML if (bML1)varxs…

XGBoost实战2--数据预测保险赔偿

一、概述 本次实战基于给出的数据进行保险预测。数据集:Allstate Claims Severity | Kaggle 给出的训练数据是116列(cat1-cat116)的离散数据和14列(con1-con14)的连续数据。数据集中的每一行表示一个保险索赔。必须预…

Jina AI @Slush 上海 地表最酷科技创新大会来啦!

地表最酷的科技创新大会 S 创上海 2023 The Final Slush Shanghai 即将在 9 月 22 - 23 日空降上海 Jina AI 受邀参与本次大会,并带来好玩的互动! 多种门票限时限量派送中 还在犹豫什么!! 就等你啦~ 什么是 S 创 2023 上海大会 本…

vulnhub靶机Thoth-Tech

下载地址:https://download.vulnhub.com/thothtech/Thoth-Tech.ova 主机发现 arp-scan -l 目标:192.168.21.148 端口扫描 nmap --min-rate 10000 -p- 192.168.21.148 服务扫描 nmap -sV -sT -O -p21,22,80 192.168.21.148 漏洞扫描 nmap --scriptvu…

IT技术2222

发布的方式 脚本 ansible 自动化,点点点

Mac电脑报错“托管配置文件格式不正确”的解决方法

本文介绍在Mac电脑中,复制地址链接后出现“托管配置文件格式不正确”这一报错的解决方法。 有时候,我们在把订阅地址粘贴到对应软件中时,会出现托管配置文件格式不正确: invalid mode: redir-host的报错。 出现这种报错,就意味着我…

座舱台架介绍与搭建流程

座舱台架介绍 车载测试中的座舱台架测试包括以下几个方面: 仪表盘:测试仪表盘的显示、功能、光线反射和防眩目性能等。评估仪表盘是否能够提供准确的驾驶信息,并能在各种光照条件下清晰可见。中控屏:测试中控屏的触摸响应、图像…

连接MySQL时报错:Public Key Retrieval is not allowed的解决方法

问题描述: DBeaver 连接 mysql 时报错:Public Key Retrieval is not allowed(不允许公钥检索) 解决方法: 连接设置 -> 驱动属性 -> allowPublicKeyRetrievalfalse(这里的运输公钥检索是默认关闭的&a…

禁用Win10自动更新

第一步,winr,输入 gpedit.msc 并回车,打开【组策略】 第二步,依次点击 管理模板->Windows组件->Windows更新 第三步,双击Windows更新,然后在设置中双击 指定 intranet Microsoft 更新服务位置 第…

融合柯西变异和自适应莱维飞行的布谷鸟优化算法,改进布谷鸟,MATLAB代码

经常有小伙伴后台留言问: 作者改进的算法可不可以用来写论文呀? 回答是:当然可以!且不用加引用! 如果我的文章能帮助到大家写论文,那是作者的荣幸呀! 布谷鸟优化算法是一个非常经典的优化算法&a…

视频怎么制作成gif动画?这个方法试试看

日常生活中我们会接触到这种各样的视频,随着拍摄工具的升级视频的画质越来越清楚体积也就越来越大。想要将这些视频转换成gif动图的时候要怎么操作呢?给大家推荐一款gif动画制作(https://www.gif.cn/)工具,上传视频仅需…

指针-字符串替换

任务描述 从标准输入读入数据,每行中最多包含一个字符串 “_xy_”,且除了字符串“_xy_”外,输入数据中不包括下划线字符,请将输入行中的 “_xy_” 替换为 “_ab_”, 在标准输出上输出替换后的结果;若没有进行过满足条…

Dockerfile RUN

语法 RUN cmd 例如: RUN apt-get update RUN [“executable”, “param1”, “param2”] 例如:RUN [“apt-get”,“update”] 请注意,每个 RUN 指令都会创建一个新的镜像层,因此在 Dockerfile 中使用 RUN 指令时,要注意…

优优嗨聚集团:外卖市场发展红火,外卖代运营服务如何发展

随着外卖市场的飞速发展,外卖代运营服务已成为新的蓝海。本文将对外卖市场的发展趋势以及外卖代运营服务的发展现状和趋势进行分析,以期为相关从业者提供参考。 一、外卖市场发展红火 近年来,外卖市场的发展速度十分惊人。根据艾媒咨询的数据…

基于SSM的车库智能管理平台设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Zabbix技术分享——如何配置SNMPTrap监控

NMP是一种网络管理协议,SNMPTrap则是基于此协议的一种数据传输方式。在Zabbix监控实践中,SNMP的应用非常广泛,下面我们来看一下如何进行SNMPTrap配置监控。 当我们获取到设备发送过来的trap的时候,需要是从trap信息中获取到Trap …

Echarts 桑基图的详细配置过程

文章目录 桑基图 简介配置步骤简易示例 桑基图 简介 Echarts桑基图(Sankey Diagram)是一种数据可视化图表类型,用于展示流量、能量、资金等在各个节点之间的流动和转化关系。桑基图通过节点和曲线来表示不同元素之间的关系,从而形…

嵌入式单片机上练手的小型图形库

大家好,今天分享一款小型的图形库。 Tiny Graphics Library: http://www.technoblogy.com/show?23OS 这个小型图形库提供点、线和字符绘图命令,用于 ATtiny85 上的 I2C 128x64 OLED 显示器. 它通过避免显示缓冲器来支持RAM有限的处理器&…