pytorch自动微分的几个例子 原文地址:http://blog.sina.com.cn/s/blog_573ef4200102xcxr.html


昨天微信‘机器之心’发布了开源软件pytorch出场的重磅消息。看内容感觉动态计算图的思路比较新颖。在初步体验其自动微分操作之后,发觉这个算法包确实是将计算图的符号占位变量和实体变量的绑定操作合二为一了。这就比其它的算法包来得更为简洁明快,学习的曲线陡降了很多。
CentOS 6.8下,建议按官网说明使用anaconda环境。关于cuda的安装和使用,按官网说明操作也很方便。官网http://pytorch.org/docsAPI的说明很详细,其上有很多具体的例子。
下面是几个自动求导的示例:

第一类:纯标量

import torch
from torch.autograd import Variablex = Variable(torch.ones(1)*3, requires_grad=True)
y = Variable(torch.ones(1)*4, requires_grad=True)
z = x.pow(2)+3*y.pow(2)     # z = x^2+3y^2, dz/dx=2x, dz/dy=6y
z.backward()   #纯标量结果可不写占位变量
print x.grad         # x = 3 时, dz/dx=2x=2*3=6
print y.grad         # y = 4 时, dz/dy=6y=6*4=24

结果:
Variable containing:
6
[torch.FloatTensor of size 1]

Variable containing:
24
[torch.FloatTensor of size 1]

第二类:全 1 向量

x = Variable(torch.ones(2)*3, requires_grad=True)
y = Variable(torch.ones(2)*4, requires_grad=True)
z = x.pow(2)+3*y.pow(2)
z.backward(torch.ones(2))
print x.grad
print y.grad

结果:
Variable containing:
6
6
[torch.FloatTensor of size 2]

Variable containing:
24
24
[torch.FloatTensor of size 2]

第三类:异值向量

x = Variable(torch.Tensor([1,2,3]), requires_grad=True)
y = Variable(torch.Tensor([4,5,6]), requires_grad=True)
z = x.pow(2)+3*y.pow(2)
z.backward(torch.ones(3))
print x.grad
print y.grad

结果:
Variable containing:
2
4
6
[torch.FloatTensor of size 3]

Variable containing:
24
30
36
[torch.FloatTensor of size 3]

第四类:矩阵乘法

x = Variable(torch.Tensor([[1,2,3],[4,5,6]]), requires_grad=True)
y = Variable(torch.Tensor([[1,2,3],[4,5,6]]), requires_grad=True)
z = x.mm(y.t())
z.backward(torch.ones(2,2))
print x.grad
print y.grad

结果:
Variable containing:
5 7 9
5 7 9
[torch.FloatTensor of size 2x3]

Variable containing:
5 7 9
5 7 9
[torch.FloatTensor of size 2x3]

第五类:矩阵和向量的乘法

x = Variable(torch.Tensor([[1,2,3],[4,5,6]]), requires_grad=True)
y = Variable(torch.Tensor([1,3,5]), requires_grad=True)  #单个方括号,否则视为矩阵,不能用mv函数
z = x.mv(y)
z.backward(torch.ones(2))
print x.grad
print y.grad

结果:
Variable containing:
1 3 5
1 3 5
[torch.FloatTensor of size 2x3]

Variable containing:
5
7
9
[torch.FloatTensor of size 3]

第六类:cuda. 第一次执行时似乎需要编译,会执行很长时间,大概需要3~5分钟,之后的运行会很快。

import torch
from torch.autograd import Variableprint '     --------  cuda scalar  --------'
x = Variable((torch.ones(1)*3).cuda(), requires_grad=True)
y = Variable((torch.ones(1)*4).cuda(), requires_grad=True)
z = (x.pow(2)+3*y.pow(2))
print 'z without cuda:  {0}'.format(type(z))
z = (x.pow(2)+3*y.pow(2))
z.backward()
print '\nx.type: {0}, x.grad: {1}'.format(type(x),x.grad)
print 'y.type: {0}, y.grad: {1}'.format(type(y),y.grad)
print 'z.type: {0}, z: {1}'.format(type(z),z)print '     --------  cuda matrix  --------'
x = Variable(torch.Tensor([[1, 2, 3], [4, 5, 6]]).cuda(), requires_grad=True)
y = Variable(torch.Tensor([[1, 2, 3], [4, 5, 6]]).cuda(), requires_grad=True)
z = x.mm(y.t())#.cuda(0,async=True)
z.backward(torch.ones(2, 2).cuda(0,async=True))print '\nx.type: {0}, x.grad: {1}'.format(type(x),x.grad)
print 'y.type: {0}, y.grad: {1}'.format(type(y),y.grad)
print 'z.type: {0}, z: {1}'.format(type(z),z)

结果:
——– cuda scalar ——–
z without cuda:

x.type: , x.grad: Variable containing:
6
[torch.cuda.FloatTensor of size 1 (GPU 0)]

y.type: , y.grad: Variable containing:
24
[torch.cuda.FloatTensor of size 1 (GPU 0)]

z.type: , z: Variable containing:
57
[torch.cuda.FloatTensor of size 1 (GPU 0)]

 --------  cuda matrix  --------

x.type: , x.grad: Variable containing:
5 7 9
5 7 9
[torch.cuda.FloatTensor of size 2x3 (GPU 0)]

y.type: , y.grad: Variable containing:
5 7 9
5 7 9
[torch.cuda.FloatTensor of size 2x3 (GPU 0)]

z.type: , z: Variable containing:
14 32
32 77
[torch.cuda.FloatTensor of size 2x2 (GPU 0)]

pytorch自动微分的几个例子相关推荐

  1. PyTorch 自动微分示例

    PyTorch 自动微分示例 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后训练第一个神经网络.autograd 软件包为 Tensors 上的所有算子提供自动微分 ...

  2. PyTorch 自动微分

    PyTorch 自动微分 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后将会去训练的第一个神经网络.该 autograd 软件包为 Tensors 上的所有操作提供 ...

  3. 《20天吃透Pytorch》Pytorch自动微分机制学习

    自动微分机制 Pytorch一般通过反向传播 backward 方法 实现这种求梯度计算.该方法求得的梯度将存在对应自变量张量的grad属性下. 除此之外,也能够调用torch.autograd.gr ...

  4. pytorch 自动微分基础原理

    PyTorch 的Autograd功能是 PyTorch 灵活快速地构建机器学习项目的一部分.它允许在复杂计算中快速轻松地计算多个偏导数(也称为 梯度) .该操作是基于反向传播的神经网络学习的核心. ...

  5. pytorch自动微分,反向传播(一)

    1.张量计算补充 2.计算图(Computational Graph) Pytorch中autograd的底层采用了计算图,计算图是一种有向无环图(DAG),用于记录算子与变量之间的关系. 下图为z= ...

  6. 一文详解pytorch的“动态图”与“自动微分”技术

    前言 众所周知,Pytorch是一个非常流行且深受好评的深度学习训练框架.这与它的两大特性"动态图"."自动微分"有非常大的关系."动态图" ...

  7. 深度学习利器之自动微分(2)

    深度学习利器之自动微分(2) 文章目录 深度学习利器之自动微分(2) 0x00 摘要 0x01 前情回顾 0x02 自动微分 2.1 分解计算 2.2 计算模式 2.3 样例 2.4 前向模式(For ...

  8. Pytorch自动求梯度

    求梯度 微分 Pytorch自动微分 微分 通常我们见到的微分方法有两种: ·符号微分法: ·数值微分法: Pytorch自动微分 对于一个Tensor,如果它的属性requires_grad 设置为 ...

  9. 深度学习利器之自动微分(1)

    深度学习利器之自动微分(1) 文章目录 深度学习利器之自动微分(1) 0x00 摘要 0.1 缘起 0.2 自动微分 0x01 基本概念 1.1 机器学习 1.2 深度学习 1.3 损失函数 1.4 ...

  10. 自动微分 ​​​​​​​​​​​​​​Automatic Differentiation

    目录 一.概述 二.原理 2.1 前向模式 2.2 后向模式 2.3 前向 VS 反向 三.Pytorch自动微分举例 四.Ref 记录自动微分的知识点. 一.概述 计算机实现微分功能, 有以下四种方 ...

最新文章

  1. eureka的惊群效应
  2. php内存缓存设计,求选择哪个缓存设计好一些?
  3. python开源项目及示例代码
  4. include 引号和尖括号的区别
  5. 【完成整理】45套很酷的长影影 LOGO 设计
  6. os.path 模块
  7. 小学毕业java_Java运算符
  8. 神经网络为什么需要随机初始化模型参数
  9. 阶段3 2.Spring_06.Spring的新注解_4 spring的新注解-Import
  10. 有需要【JavaScript权威指南第七版、JavaScript高级程序设计第四版】的可以私信我哈
  11. nodejs+vue+elementui房屋租赁网站系统 python协同过滤推荐系统
  12. 中信建投X袋鼠云:实时数仓,证券机构的“速度与稳定”
  13. 大学生创新创业万学答案
  14. 跨域 CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
  15. 冯·诺依曼体系结构介绍
  16. 1.3-15:苹果和虫子
  17. 像FIFA一样踢球的AI,比打游戏更强吗?
  18. 【多益网络校招提前批】22届的同学可以冲啦
  19. GIC spec之ITS和LPI中断3
  20. 苏州、上海校友聚会(2005年9月10日,周六)

热门文章

  1. python 字符串不相等_python实现找出来一个字符串中最长不重复子串
  2. sqlserver安装介质上文件的长路径名称失败_SQL Server 2012 软件安装教程
  3. Go基础:数组、切片与指针
  4. JavaWeb:Redis
  5. Guava学习笔记(六):Immutable(不可变)集合
  6. 递归算法计算八皇后问题(Eight Queen Problem with Recursive Algorithm)
  7. LIO-SAM探秘第三章之代码解析(一) --- utility.h + imageProjection.cpp
  8. Python_基于statsmodel包画Bland altman plot (Mean Difference Plot)用于预测结果分析
  9. 目标跟踪入门篇—相关滤波
  10. linux ip地址配置