自动差分引擎

 

torch.autograd是 PyTorch 的自动差分引擎,可为神经网络训练提供支持。

 

1. 背景

 

神经网络(NN)是在某些输入数据上执行的嵌套函数的集合。 这些函数由参数(由权重和偏差组成)定义,这些参数在 PyTorch 中存储在张量中。

训练 NN 分为两个步骤:

正向传播:在正向传播中,NN 对正确的输出进行最佳猜测。 它通过其每个函数运行输入数据以进行猜测。

反向传播:在反向传播中,NN 根据其猜测中的误差调整其参数。 它通过从输出向后遍历,收集有关函数参数(梯度)的误差导数并使用梯度下降来优化参数来实现。

 

2. 在PyTorch中的用法

 

从torchvision加载了经过预训练的 resnet18 模型。 我们创建一个随机数据张量来表示具有 3 个通道的单个图像,高度&宽度为 64,其对应的label初始化为一些随机值。

In [1]:
import torch, torchvision
model = torchvision.models.resnet18(pretrained=True)
data = torch.rand(1, 3, 64, 64)
labels = torch.rand(1, 1000)
In [2]:
data
Out[2]:
tensor([[[[0.0421, 0.5498, 0.7633,  ..., 0.2027, 0.8481, 0.4255],
[0.0836, 0.1886, 0.6250, ..., 0.7480, 0.9735, 0.9916],
[0.5927, 0.5473, 0.0020, ..., 0.0484, 0.4672, 0.3397],
...,
[0.0417, 0.1756, 0.4057, ..., 0.6818, 0.5592, 0.0416],
[0.5929, 0.5567, 0.4616, ..., 0.7430, 0.3945, 0.5043],
[0.0605, 0.1436, 0.4877, ..., 0.3241, 0.3844, 0.1287]], [[0.8837, 0.8610, 0.0051, ..., 0.5536, 0.8028, 0.9089],
[0.2953, 0.7259, 0.1958, ..., 0.4079, 0.2951, 0.0619],
[0.7267, 0.6365, 0.2589, ..., 0.3394, 0.7242, 0.0889],
...,
[0.8844, 0.3406, 0.3673, ..., 0.5602, 0.8214, 0.5659],
[0.0224, 0.1693, 0.6389, ..., 0.7752, 0.6179, 0.7025],
[0.0381, 0.5284, 0.7387, ..., 0.0622, 0.8492, 0.6335]], [[0.1731, 0.2461, 0.3651, ..., 0.5243, 0.4385, 0.5899],
[0.8973, 0.8928, 0.1662, ..., 0.8957, 0.8555, 0.4384],
[0.7018, 0.5639, 0.9140, ..., 0.1942, 0.8108, 0.3777],
...,
[0.5671, 0.1807, 0.6835, ..., 0.5997, 0.3520, 0.7260],
[0.4286, 0.2101, 0.6863, ..., 0.5068, 0.8704, 0.2469],
[0.6926, 0.3865, 0.5115, ..., 0.7462, 0.6604, 0.4729]]]])
 

接下来,我们通过模型的每一层运行输入数据以进行预测。 这是正向传播。

In [3]:
prediction = model(data) # forward pass
 

我们使用模型的预测和相应的标签来计算误差(loss)。 下一步是通过网络反向传播此误差。 当我们在误差张量上调用.backward()时,开始反向传播。 然后,Autograd 会为每个模型参数计算梯度并将其存储在参数的.grad属性中。

In [4]:
loss = (prediction - labels).sum()
loss.backward() # backward pass
 

接下来,我们加载一个优化器,在本例中为 SGD,学习率为 0.01,动量为 0.9。 我们在优化器中注册模型的所有参数。

In [5]:
optim = torch.optim.SGD(model.parameters(), lr=1e-2, momentum=0.9)
 

最后,我们调用.step()启动梯度下降。 优化器通过.grad中存储的梯度来调整每个参数。

In [6]:
optim.step() #gradient descent
In [7]:
optim
Out[7]:
SGD (
Parameter Group 0
dampening: 0
lr: 0.01
momentum: 0.9
nesterov: False
weight_decay: 0
)
 

3. autograd的微分

 

我们用requires_grad=True创建两个张量a和b。 这向autograd发出信号,应跟踪对它们的所有操作。

In [8]:
import torch

a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)
 

我们从a和b创建另一个张量Q。

In [9]:
Q = 3*a**3 - b**2
 

假设a和b是神经网络的参数,Q是误差。 在 NN 训练中,我们想要相对于参数的误差,即

 

 

 

当我们在Q上调用.backward()时,Autograd 将计算这些梯度并将其存储在各个张量的.grad属性中。

 

我们需要在Q.backward()中显式传递gradient参数,因为它是向量。 gradient是与Q形状相同的张量,它表示Q相对于本身的梯度,即

 

 

同样,我们也可以将Q聚合为一个标量,然后隐式地向后调用,例如Q.sum().backward()。

In [10]:
external_grad = torch.tensor([1., 1.])
Q.backward(gradient=external_grad)
 

梯度现在沉积在a.grad和b.grad中

In [11]:
a.grad
Out[11]:
tensor([36., 81.])
In [12]:
a
Out[12]:
tensor([2., 3.], requires_grad=True)
In [13]:
9*a**2
Out[13]:
tensor([36., 81.], grad_fn=<MulBackward0>)
In [14]:
# check if collected gradients are correct
print(9*a**2 == a.grad)
print(-2*b == b.grad)
 
tensor([True, True])
tensor([True, True])

pytorch学习笔记二之自动差分引擎的更多相关文章

  1. 莫烦pytorch学习笔记(二)——variable

    .简介 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Variable和tensor的区别和联系 Variable是篮子, ...

  2. 莫烦 - Pytorch学习笔记 [ 二 ] CNN ( 1 )

    CNN原理和结构 观点提出 关于照片的三种观点引出了CNN的作用. 局部性:某一特征只出现在一张image的局部位置中. 相同性: 同一特征重复出现.例如鸟的羽毛. 不变性:subsampling下图 ...

  3. InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  4. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  5. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  6. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  7. Django学习笔记二

    Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...

  8. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  9. ArcGIS案例学习笔记-CAD数据自动拓扑检查

    ArcGIS案例学习笔记-CAD数据自动拓扑检查 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:针对CAD数据,自动进行拓扑检查 优点:类别:地理建模项目实例 ...

  10. python3.4学习笔记(二) 类型判断,异常处理,终止程序

    python3.4学习笔记(二) 类型判断,异常处理,终止程序,实例代码: #idle中按F5可以运行代码 #引入外部模块 import xxx #random模块,randint(开始数,结束数) ...

随机推荐

  1. TypeError: Object(…) is not a function

    vue中遇到的这个错误 1. 先检查变量名或者函数名是否有重复定义 报这错之后看了好久,也没有发现starkflow上说的,重复定义了变量或者函数 2. vue的话 检查下函数写的位置,直接写到cre ...

  2. Flutter和Rust如何优雅的交互

    前言 文章的图片链接都是在github上,可能需要...你懂得:本文含有大量关键步骤配置图片,强烈建议在合适环境下阅读 Flutter直接调用C层还是蛮有魅力,想想你练习C++,然后直接能用flutt ...

  3. 时间老去,Ruby不死,Ruby语言基础入门教程之Ruby3全平台开发环境搭建EP00

    如果说电子游戏是第九艺术,那么,编程技术则配得上第十艺术的雅称.艺术发展的普遍规律就是要给与人们对于艺术作品的更高层感受,而Matz的Ruby语言则正是这样一件艺术品. 无论是语法还是理念,都让Rub ...

  4. css images图片铺满 不变型 以及头像裁剪 属性

    一,图片的引入 background:url(img_flwr.gif); background-repeat:no-repeat; //平铺 二,图片的大小不不变形 background-size: ...

  5. vite+ts+vue3+router4+Pinia+ElmPlus+axios+mock项目基本配置

    1.vite+TS+Vue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Selec ...

  6. 解决MySQL Connector/ODBC驱动无法安装Error1918

    1.问题描述 我在一台windows服务器上安装好mysql之后,再安装mysql的ODBC连接驱动时,报错如下: 2.解决方法 之所以出现安装失败是由于缺少Miscrosoft Visual C++ ...

  7. CSP-S2022 游记

    Day 998244350 模拟赛场场被学弟吊打.最后几天写了一堆随机化乱搞题以及奇怪的搜索,都是 CSP 不曾考的玩意(书接下文). 点分治已经敲烂了.最后两场每场一个. Day 499122175 ...

  8. Blazor如何实现类似于微信的Tab切换?

    是否有小伙伴在使用tab的时候想进行滑动切换Tab? 并且有滑动左出左进,右出右进的效果 ,本文将讲解怎么在Blazor中去通过滑动切换Tab 本文中的UI组件使用的是MASA Blazor,您也可以 ...

  9. MySQL 判断语句 条件函数 case when、if、ifnull

    在MySQL中,需要用到条件判断函数,例如 case when.if.ifnull. 一.方法分类 二.具体方法 (1)if if(expr,result_true,result_false) 注意: ...

  10. Strapi入门记--01创建项目,账户,测试表,测试接口

    Strapi 是什么 中文文档地址 Strapi 是一个开源的无头 CMS,开发人员可以自由选择他们喜欢的工具和框架,并允许编辑使用他们的应用程序的管理面板来管理和分发他们的内容.基于一个插件系统,S ...