1 Variable类型与自动微分模块概述

1.1 Variable类型

Variable是由Autograd模块对张量进行进一步封装实现的,具有自动求导的功能

1.2 Autograd模块(自动求导模块)

Autograd模块:在神经网络的反向传播中,基于正向计算的结果进行微分计算,从而实现对于网络权重的更新与迭代,提供了张量的自动求微分功能,可以通过代码来实现对反向过程的控制,使得权重参数朝着目标结果进行更新与发展。

2 Variable类型与自动微分模块实战

2.1 Variable类型对象与张量对象之间的转化

2.1.1 代码实现

import torch
from torch.autograd import Variablea = torch.FloatTensor([4]) #创建张量
print(Variable(a)) # 将张量转化为Variable对象
# 输出 tensor([4.])
print(Variable(a,requires_grad=True)) # requires_grad允许自动求导
# 输出 tensor([4.], requires_grad=True)
print(a.data) #将Variable对象转化为张量
# 输出 tensor([4.])

2.1.2 注意

import torch
from torch.autograd import Variable### 使用requires_grad时,要求张量的值必须为浮点型
x = torch.tensor([1],requires_grad=True) #报错 x = torch.tensor([1.],requires_grad=True) #正确写法

2.2 torch.no_grad()

2.2.1 概述

torch.no_grad():使Variable类型变量的requires_grad失效

torch.enable_grad():使Variable类型变量的requires_grad有效

2.2.2 使用torch.no_grad()配合with语句限制requires_grad的作用域

import torch
from torch.autograd import Variablex = torch.ones(2,2,requires_grad=True) # 定义一个需要梯度计算的Variable类型对象
with torch.no_grad():y = x * 2
print(y.requires_grad) # 输出 False

2.2.3 使用装饰器@实现

import torch
from torch.autograd import Variable### 在神经网络中将网络模型进行封装,使用装饰器方便实现开发的便捷性x = torch.ones(2,2,requires_grad=True) # 定义一个需要梯度计算的Variable类型对象
@torch.no_grad()
def doubler(x):return x * 2
z = doubler(x)
print(z.requires_grad) # 输出 False

2.3 函数enable_grad()与no_grad()的嵌套使用

2.3.1 enable_grad()配合with语句限制requires_grad的作用域

import torch
x = torch.ones(2,2,requires_grad=True) # 定义一个需要梯度计算的Variable类型对象
with torch.no_grad():with torch.enable_grad():y = x * 2print(y.requires_grad) # Trueprint(y.requires_grad) # True
print(y.requires_grad) # True

2.3.2 使用enable_grad装饰器

import torch
x = torch.ones(2,2,requires_grad=True) # 定义一个需要梯度计算的Variable类型对象
@torch.enable_grad()
def doubler(x): #封装到函数中return x * 2
with torch.no_grad(): #使得计算梯度失效z = doubler(x)
print(z.requires_grad) #True

2.3.3 作用在没有requires_grad的Variable类型变量上将会失效,不能使其重新获得计算梯度的属性

import torch
x = torch.ones(2,2) # 定义一个不需要梯度计算的Variable类型对象
with torch.enable_grad():y = x * 2
print(y.requires_grad) # False

2.3 set_grad_enabled()实现统一管理梯度计算

import torch
x = torch.ones(2,2,requires_grad=True) # 定义一个需要梯度计算的Variable类型对象
torch.set_grad_enabled(False) # 统一关闭梯度计算
y = x * 2
print(y.requires_grad) # False
torch.set_grad_enabled(True) # 统一开启梯度计算
y = x * 2
print(y.requires_grad) # True

2.4 Variable类型对象的grad_fn属性

2.4.1 grad_fn属性概述

Variable类型对象在经过前向传播后,将会增加一个grad_fn属性,该属性随着backward()方法进行自动的梯度计算。没有经过计算的Variable类型对象是没有这个属性的,在requires_grad=False的情况下,无论如何计算他都不会有grad_fn属性。

2.4.2 grad_fn属性代码实现

import torch
from torch.autograd import Variablex = Variable(torch.ones(2,2),requires_grad=True)
print(x)
# 输出 tensor([[1., 1.],[1., 1.]], requires_grad=True)
print(x.grad_fn)
# 输出 Nonem = x + 2 # 经过正向计算,获得grad_fn属性
print(m.grad_fn)
# 输出 <AddBackward0 object at 0x0000024E1AA14D00>
print(m.grad_fn(x)) #对x变量进行求梯度计算
# 输出 (tensor([[1., 1.],[1., 1.]], requires_grad=True), None)x2 = torch.ones(2,2) # 创建一个不需要梯度计算的张量
m = x2 + 2
print(m.grad_fn)
# 输出 None

2.5 Variable类型对象的is_leaf函数

2.5.1 is_leaf()概述

1、定义Variable类型对象时,若将requires_grad设为True,则将该Variable类型对象称为种子节点,其 is_leaf的属性为True。

2、若Variable类型对象不是通过自定义生成的,而是通过其他张量计算所得时,则不是叶子节点,则该该Variable类型对象称为叶子节点,其 is_leaf的属性为False。

3、Pytorch会记录每个张量的由来,由此来在内存中行程树状结构实现反向链式计算,叶子节点主要在求导过程为递归循环提供信号指示,当反向链式计算遇到叶子节点则终止递归循环。

2.5.2 is_leaf()代码

import torch
from torch.autograd import Variablex = Variable(torch.ones(2,2),requires_grad=True)
print(x.is_leaf) # True
m = x + 2
print(m.is_leaf) # False

2.6 backward()实现自动求导

2.6.1 backward()概述

backward():必须在当前变量内容是标量的情况下使用,否则会报错。

2.6.3 自动求导的作用

从复杂的神经网络中,自动将每一层中的每个参数的梯度计算出来,实现训练过程中的反向传播。

2.6.2 代码

import torch
from torch.autograd import Variable### y = (x + 2)/4
x = Variable(torch.ones(2,2),requires_grad=True)
m = x + 2
f = m.mean() #得到一个标量
f.backward() # 自动求导
print(f) #输出 tensor(3., grad_fn=<MeanBackward0>)
print(x.grad) # 输出 tensor([[0.2500, 0.2500],[0.2500, 0.2500]])

2.7 detach()将Variable类型对象分离成种子节点

2.7.1 将需要求梯度的Variable类型对象转化为Numpy对象

import torch
from torch.autograd import Variable### 如果被分离的Variable对象的volatile属性为True,那么被分离出的volatile属性也为True
### 被返回的Variable对象和被分离的Variable对象指向同一个张量,并且永远不会需要梯度
x = Variable(torch.ones(2,2),requires_grad=True)
# x.numpy() # 报错Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
x1 = x.detach().numpy()
print(x1)# 输出 [[1.,1.],[1.,1.]]

2.7.2 实现对网络中的部分参数求梯度

2.8 volatile属性

早期代码中可以通过设置Variable类型对象的volatile属性为True的方法来实现停止梯度更新。

【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析相关推荐

  1. 【Pytorch神经网络理论篇】 27 图神经网络DGL库:简介+安装+卸载+数据集+PYG库+NetWorkx库

    DGL库是由纽约大学和亚马逊联手推出的图神经网络框架,支持对异构图的处理,开源相关异构图神经网络的代码,在GCMC.RGCN等业内知名的模型实现上也取得了很好的效果. 1 DGL库 1.1 DGL库的 ...

  2. 【Pytorch神经网络理论篇】 20 神经网络中的注意力机制

    注意力机制可以使神经网络忽略不重要的特征向量,而重点计算有用的特征向量.在抛去无用特征对拟合结果于扰的同时,又提升了运算速度. 1 注意力机制 所谓Attention机制,便是聚焦于局部信息的机制,比 ...

  3. 【Pytorch神经网络理论篇】 12 卷积神经网络实现+卷积计算的图解

    1 卷积神经网络接口 1.1 卷积接口介绍 torch.nn.functional.conv1d:实现按照1个维度进行的卷积操作,常用于处理序列数据. torch.nn.functional.conv ...

  4. 【Pytorch神经网络理论篇】 25 基于谱域图神经网络GNN:基础知识+GNN功能+矩阵基础+图卷积神经网络+拉普拉斯矩阵

    图神经网络(Graph Neural Network,GNN)是一类能够从图结构数据中学习特征规律的神经网络,是解决图结构数据(非欧氏空间数据)机器学习问题的最重要的技术. 1 图神经网络的基础知识 ...

  5. 【Pytorch神经网络理论篇】 23 对抗神经网络:概述流程 + WGAN模型 + WGAN-gp模型 + 条件GAN + WGAN-div + W散度

    1 对抗神经简介 1.1 对抗神经网络的基本组成 1.1.1 基本构成 对抗神经网络(即生成式对抗网络,GAN)一般由两个模型组成: 生成器模型(generator):用于合成与真实样本相差无几的模拟 ...

  6. 【Pytorch神经网络理论篇】 22 自编码神经网络:概述+变分+条件变分自编码神经网络

    1 无监督学习模型的概述 在监督训练中,模型能根据预测结果与标签差值来计算损失,并向损失最小的方向进行收敛. 在无监督训练中,无法通过样本标签为模型权重指定收敛方向,这就要求模型必须有自我监督的功能. ...

  7. 【Pytorch神经网络理论篇】 13 深层卷积神经网络介绍+池化操作+深层卷积神经网络实战

    1 深层卷积神经网络概述 1.1 深层卷积神经网络模型结构图 1.1.1 深层卷积神经网络的正向结构构成剖析 输入层,将每个像素作为一个特征节点输入网络. 卷积层:由多个滤波器组合而成. 池化层:将卷 ...

  8. 【Pytorch神经网络理论篇】 10 优化器模块+退化学习率

    1 优化器模块的作用 1.1 反向传播的核心思想 反向传播的意义在于告诉模型我们需要将权重修改到什么数值可以得到最优解,在开始探索合适权重的过程中,正向传播所生成的结果与实际标签的目标值存在误差,反向 ...

  9. 【Pytorch神经网络理论篇】 09 神经网络模块中的损失函数

    1 训练模型的步骤与方法 将样本书记输入到模型中计算出正向的结果 计算模型结果与样本目标数值之间的差值(也称为损失值loss) 根据损失值,使用链式反向求导的方法,依次计算出模型中每个参数/权重的梯度 ...

最新文章

  1. Android开发精要3--Android中的Intent机制
  2. Hadoop书籍和网络资源介绍
  3. 【译】Why Wayland on Android is a hard problem
  4. boost::mp11::mp_map_replace相关用法的测试程序
  5. Visual C++ 的代码折叠
  6. (11) nginx + keepalived 双机热备
  7. Tomcat应用中post方式传参数长度限制
  8. redis学习笔记-安装与入门
  9. python爬虫短片_Python爬虫练习:爬取全民小视频(附代码,过程)
  10. Game of Lines(POJ-3668)
  11. C语言程序设计第二次作业1
  12. 微博月活跃用户数增至5.73亿 移动端用户占比达94%
  13. 2015年3月29号日报
  14. C Tricks(十三)—— trim 的实现
  15. php文本框清除格式,php如何清除HTML格式
  16. [转] MongoDB shell 操作 (查询)
  17. 指数函数e^x和对数函数lnx 导数的求导过程
  18. /usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录
  19. 记录由于未关闭加速器就关机而导致的再次启动后DNS配置错误
  20. 12.2 数据库控制文件复制到ASM磁盘组

热门文章

  1. 关于ORACLE 语句中,IN 超过1000个的解决方法
  2. OSPF次末节区域配置 201
  3. akshare写etf动量滚动策略
  4. 多线程数据下载(akshare)
  5. 网络爬虫--5.urllib库的基本使用(1)
  6. 计算机应用基础精品课程申报表,《计算机应用基础》精品课程申报书(修改意见)...
  7. mysql 集群架构_mysql企业常用集群架构
  8. 手写springboot_Spring Boot 入门教程 | 图文讲解
  9. c语言建立一个链表,每个结点包括姓名和成绩,求C语言几道题的答案~~拜托了~~...
  10. 位图索引,数据库索引浅浅的学习