首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

零基础学习人工智能—Python—Pytorch学习(二)

编程知识
2024年08月08日 09:32

前言

数学的学习跟数学的计算是要分开的,现在回头再去看大学的高数和线性代数,如果只是学习的话,其实一门课程3天,也就学完了。
学校的课程之所以上那么久,其实是为了考试,也就是为计算准备的。计算有意义的,在有计算机的情况下,计算的意义并不是很大。
所以,如果大学数学没学好,只要花一星期,就能补回来。甚至你没上过大学,只要你上过初中,同样,只需要一个星期就能学会高数和线性代数。
但,问题是,没有人这样给你上课,也没有这样资料让你学习。至少国内是没有这样学习的信息,国内全是耽误我们学习效率的学习模式。

Gradient

上一篇介绍了一点梯度,正向传播,逆向传播。这里再详细介绍一下。
不要被这些名词吓住了,名词的本质都是总结,而总结的名词,其实是最阻碍我们学习的,我们要讨厌它,但不用害怕它。
先看一下requires_grad这个参数的使用,代码如下:

print("============求梯度1==============")
a = torch.randn(3) #这里是randn 不是rand  torch.randn:生成服从标准正态分布(均值为0,标准差为1)的随机数。  torch.rand:生成服从均匀分布(在区间 [0, 1) 之间)的随机数。
print(a)
b=a+2
print(b) # 输出tensor是a+2计算后的结果
x = torch.randn(3,requires_grad=True) #这里是randn 不是rand
print(x)
y=x+2
print(y)  # 输出tensor是x+2计算后的结果,同时记录了函数,grad_fn=<AddBackward0> 表示是加法函数 grad=gradient  fn=Function

这里a和x分别是开启了requires_grad和没有开始requires_grad的模式。如下图:
image
开启了requires_grad的x,多了一个属性requires_grad=True。
经过y=x+2计算的y,多了一个属性grad_fn=< AddBackward0 >,这里grad=gradient fn=Function,就是梯度函数的意思;里面的Add是加法的意思。
而这个y=x+2,这个计算就是前向传播,前向传播就是这一堆我们定义的函数。

正态分布简介

上面提到了正态分布,这里简单解释一下。
正态分布 若以0为中心,称为均值为0。若均值为0,标准差为1,数据点在不同区间内的分布遵循68-95-99.7规则
均值0,标准差1(数据在68%[-1, 1]95%[-2, 2]99.7%[-3, 3])。即数据以0为中心,向两边扩散,68%的数据点位于均值的1个标准差范围内(即[-1, 1]区间)95%的数据点位于均值的2个标准差范围内(即[-2, 2]区间)。99.7%的数据点位于均值的3个标准差范围内(即[-3, 3]区间)。
均值0,标准差2,数据在68%[-2, 2]95%[-4, 4]99.7%[-6, 6])。

标量函数和逆向传播

上面我们使用了前向传播,并设置y=x+2这样的函数,现在我们在增加一个前向传播函数:z=yy2,然后再设置标量函数,最后在执行逆向传播。
注1:在使用backward前,必须给一个scale value(标量值,即常数C) 比如z=z.mean(),或者给一个权度tensor,这里先介绍传递标量函数。
注2:标量函数就是前向传播中的计算损失的损失函数。
注3:标量函数其实是一个标量,或称常量,或称常熟,或称值,或者称一个数。(这里要是说传递的是一个数,那就low了,但要说传了一个标量,就明显较高大上了,这就是名词阻碍我们学习的最完美体现了)。

x = torch.randn(3,requires_grad=True)
print(x)
y=x+2
z=y*y*2
print(z) # 这里会增加属性,grad_fn=<MulBackward0> ,这里的mul表示是乘法
z=z.mean() # 指定标量函数
#这里必须指定标量函数,如果删除z=z.mean() 这句话会提示 grad can be implicitly created only for scalar outputs 
print(z) # 属性grad_fn=<MeanBackward0>,Mean表示平均值函数
z.backward() #逆向传播 如果requires_grad=False,则执行z.backward()回抛异常,因为没有记录grad_fn
print(x.grad)

运行如下图:
image

代码简介如下

x 是启用了自动求导的张量。
y = x + 2,y 仍是一个启用了自动求导的张量。
z = y * y * 2,z 是一个启用了自动求导的张量。
z = z.mean(),z 是标量(因为 mean() 返回的是张量的平均值,结果是标量)。
调用 z.backward(),计算 z 对 x 的梯度,并将其存储在 x.grad 中。
此时,x.grad 中存储的是 z 对 x 的梯度,即 dz/dx;梯度的结构是跟x的结构一样的。

梯度清0

在第二次计算梯度(调用backward())之前需要清零梯度。
如果在第二次调用 backward() 之前没有清零梯度,那么第二次调用 backward() 计算出的梯度会叠加在第一次计算出的梯度上。

print("============清零grad==============")
weights =torch.ones(4,requires_grad=True)
for epoch in range(3):
    model_output =(weights*3).sum()#设置标量值,这里是连写了,分开就是a=weight*3 model_output=a.sum()
    model_output.backward()
    print(model_output.grad)
    model_output.zero_()#可以注释这一行,看看不清零的效果

加权

在计算梯度(调用backward())之前没有设置标量或权度,就会报错。
上面说过了标量,现在来介绍加权。
代码如下:

x = torch.randn(3,requires_grad=True)
print(x)
y=x+2
z=y*y*2
v = torch.tensor([1.0,2.0,3.0],dtype=torch.float32)
z.backward(v)
print(x.grad)

这里再z.backward()调用前,增加了一个赋值权度的操作。
所谓赋值权度就是使用z.backward()时传递一个参数,这个参数就是一个张量(tensor);这个tensor的结构要求和x一样。
在计算梯度时,会把梯度的计算结果,x,权度tensor,全提出来,然后相乘。
因为梯度,x,权度tensor的结构是相同的,对应元素相乘,应该比较好理解。

具体计算

y=x+2,dy/dx=y导=1
z=2y²,dz/dy=z导=4y
dz/dx=(dz/dy)(dy/dx)=14y=4y
因为y=x+2所以 4y=4(x+2)
加权后是三个元素分别是 14(x1+2) 24(x2+2) 34(x3+2)
带入x即可得到梯度。
如下图,4
(0.8329+2)=11.3316,下图是11.3317,这里应该是有个进位。
image

传送门:
零基础学习人工智能—Python—Pytorch学习(一)

基础学习就先到这。


注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!



若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

https://www.cnblogs.com/kiba/p/18348414

From:https://www.cnblogs.com/kiba/p/18348414
本文地址: http://shuzixingkong.net/article/905
0评论
提交 加载更多评论
其他文章 记一次 .NET某智慧出行系统 CPU爆高分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他们的系统出现了CPU 100%的情况,让我帮忙看一下怎么回事?dump也拿到了,本想着这种情况让他多抓几个,既然有了就拿现有的分析吧。 二:WinDbg 分析 1. 为什么会爆高 既然说是 100%,作为调试者得拿数据说话,可以使用 !tp 来观测一
记一次 .NET某智慧出行系统 CPU爆高分析 记一次 .NET某智慧出行系统 CPU爆高分析 记一次 .NET某智慧出行系统 CPU爆高分析
MySQL 5.7 DDL 与 GH-OST 对比分析
本文首先介绍MySQL5.7 DDL以及GH-OST的原理,然后从效率、空间占用、锁阻塞、binlog日志产生量、主备延时等方面,对比GH-OST和MySQL5.7 DDL的差异。
MySQL 5.7 DDL 与 GH-OST 对比分析 MySQL 5.7 DDL 与 GH-OST 对比分析 MySQL 5.7 DDL 与 GH-OST 对比分析
.NET 与 LayUI 实现高效敏捷开发框架
前言 WaterCloud 是一个集成了 LayUI 的高效敏捷开发框架,专为 .NET 开发者设计。 它不仅支持多种 .NET 版本(.NET 4.5、.NET Core 3.1、.NET 5、.NET 6),还内置了丰富的功能,如权限管理、流程表单设计以及多数据库支持下的多租户架构。使用了 OR
.NET 与 LayUI 实现高效敏捷开发框架 .NET 与 LayUI 实现高效敏捷开发框架 .NET 与 LayUI 实现高效敏捷开发框架
告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验
告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验 Huggingface国内开源镜像:https://hf-mirror.com/ 里面总结了很多下载的方法,下面进行一一讲解 方法一:网页下载 在模型主页的Files and Version中中可以获取文件的下载链接。无需
告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验 告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验 告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验
总有坏人想爬我网站的数据,看我用这 10 招干他!
大家好,我是程序员鱼皮。前两天模拟面试一位社招两年的老哥,由于他的表现不错,我就临时起意,跟他交流一下我们最近遇到的业务场景问题。问题如下: 最近我们不是做了个 程序员刷题网站 - 面试鸭 嘛,有很多坏人盯上了我们网站,想把我们 4,000 多道面试题、100 多个面试题库的数据都用爬虫抓下来。那我
总有坏人想爬我网站的数据,看我用这 10 招干他! 总有坏人想爬我网站的数据,看我用这 10 招干他! 总有坏人想爬我网站的数据,看我用这 10 招干他!
双指针优化
双指针优化 为什么我为OI泪目?因为我菜得离谱...... 引入 双指针是一种简单而又灵活的技巧和思想,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处。 双指针顾名思义,就是同时使用两个指针,在序列、链表结构上指向的是位置,在树、图结构中指向的是节点,通过或同向移动,或相向移动来
双指针优化 双指针优化
[rCore学习笔记 023]任务切换
导读 还是要先看官方手册. 学过DMA的同志可能比较好理解,一句话, 释放CPU总线 : 如果把应用程序执行的整个过程进行进一步分析,可以看到,当程序访问 I/O 外设或睡眠时,其实是不需要占用处理器的,于是我们可以把应用程序在不同时间段的执行过程分为两类,占用处理器执行有效任务的计算阶段和不必占用
[rCore学习笔记 023]任务切换 [rCore学习笔记 023]任务切换 [rCore学习笔记 023]任务切换
前端使用 Konva 实现可视化设计器(20)- 性能优化、UI 美化
这一章主要分享一下使用 Konva 遇到的性能优化问题,并且介绍一下 UI 美化的思路,主要使用 Naive UI。
前端使用 Konva 实现可视化设计器(20)- 性能优化、UI 美化 前端使用 Konva 实现可视化设计器(20)- 性能优化、UI 美化