PyTorch教程之Autograd
在PyTorch中,autograd是所有神经网络的核心内容,为Tensor所有操作提供自动求导方法。
它是一个按运行方式定义的框架,这意味着backprop是由代码的运行方式定义的。
一、Variable
autograd.Variable 是autograd中最核心的类。 它包装了一个Tensor,并且几乎支持所有在其上定义的操作。一旦完成了你的运算,你可以调用 .backward()来自动计算出所有的梯度。
Variable有三个属性:data,grad以及creator。
访问原始的tensor使用属性.data; 关于这一Variable的梯度则集中于 .grad; .creator反映了创建者,标识了是否由用户使用.Variable直接创建(None)。
还有一个对autograd的实现非常重要的类——Function。Variable 和Function数是相互关联的,并建立一个非循环图,从而编码完整的计算过程。每个变量都有一个.grad_fn属性引用创建变量的函数(除了用户创建的变量,它们的grad_fn是None)。
import torch
from torch.autograd import Variable
创建变量x:
x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)
输出结果:
Variable containing:
1 1
1 1
[torch.FloatTensor of size 2x2]
在x基础上进行运算:
y = x + 2
print(y)
输出结果:
Variable containing:
3 3
3 3
[torch.FloatTensor of size 2x2]
查看x的
grad_fn:
print(x.grad_fn)
输出结果:
None
查看y的
grad_fn:
print(y.grad_fn)
输出结果:
<torch.autograd.function.AddConstantBackward object at 0x7f603f6ab318>
可以看到y是作为运算的结果产生的,所以y有
grad_fn,而x是直接创建的,所以x没有grad_fn。
在y基础上进行运算:
z = y * y * 3
out = z.mean()
print(z, out)
输出结果:
Variable containing:
27 27
27 27
[torch.FloatTensor of size 2x2]
Variable containing:
27
[torch.FloatTensor of size 1]
二、Gradients
如果Variable是一个标量(例如它包含一个单元素数据),你无需对backward()指定任何参数.
out.backward()
等价于out.backward(torch.Tensor([1.0])).
out.backward()
print(x.grad)
输出结果:
Variable containing:
4.5000 4.5000
4.5000 4.5000
[torch.FloatTensor of size 2x2]
如果它有更多的元素(矢量),你需要指定一个和tensor的形状匹配的grad_output参数(y在指定方向投影对x的导数)
x = torch.randn(3)
x = Variable(x, requires_grad=True) y = x * 2
while y.data.norm() < 1000:
y = y * 2 print(y)
输出结果:
Variable containing:
-1296.5227
499.0783
778.8971
[torch.FloatTensor of size 3]
不传入参数:
y.backward()
print(x.grad)
输出结果:
RuntimeError: grad can be implicitly created only for scalar outputs
None
传入参数:
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)
输出结果:
Variable containing:
102.4000
1024.0000
0.1024
[torch.FloatTensor of size 3]
简单测试一下不同参数的效果:
参数1:[1,1,1]
x=torch.FloatTensor([1,2,3])
x = Variable(x, requires_grad=True)
y = x * x
print(y) gradients = torch.FloatTensor([1,1,1])
y.backward(gradients)
print(x.grad)
输出结果:
Variable containing:
1
4
9
[torch.FloatTensor of size 3]
Variable containing:
2
4
6
[torch.FloatTensor of size 3]
参数2:[3,2,1]
x=torch.FloatTensor([1,2,3])
x = Variable(x, requires_grad=True)
y = x * x
print(y) gradients = torch.FloatTensor([3,2,1])
y.backward(gradients)
print(x.grad)
输出结果:
Variable containing:
1
4
9
[torch.FloatTensor of size 3]
Variable containing:
6
8
6
[torch.FloatTensor of size 3]
PyTorch教程之Autograd的更多相关文章
- PyTorch教程之Training a classifier
我们已经了解了如何定义神经网络,计算损失并对网络的权重进行更新. 接下来的问题就是: 一.What about data? 通常处理图像.文本.音频或视频数据时,可以使用标准的python包将数据加载 ...
- PyTorch教程之Neural Networks
我们可以通过torch.nn package构建神经网络. 现在我们已经了解了autograd,nn基于autograd来定义模型并对他们有所区分. 一个 nn.Module模块由如下部分构成:若干层 ...
- PyTorch教程之Tensors
Tensors类似于numpy的ndarrays,但是可以在GPU上使用来加速计算. 一.Tensors的构建 from __future__ import print_function import ...
- [转]搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速
搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速 有的同学反映自己的搬瓦工速度慢,丢包率高.这其实和你的网络服务提供商有关.据我所知一部分上海电信的同学就有这种问题.那么碰到了坑爹的网络服务 ...
- jQuery EasyUI教程之datagrid应用(三)
今天继续之前的整理,上篇整理了datagrid的数据显示及其分页功能 获取数据库数据显示在datagrid中:jQuery EasyUI教程之datagrid应用(一) datagrid实现分页功能: ...
- jQuery EasyUI教程之datagrid应用(二)
上次写到了让数据库数据在网页datagrid显示,我们只是单纯的实现了显示,仔细看的话显示的信息并没有达到我们理想的效果,这里我们丰富一下: 上次显示的结果是这样的 点击查看上篇:jQuery Eas ...
- jQuery EasyUI教程之datagrid应用(一)
最近一段时间都在做人事系统的项目,主要用到了EasyUI,数据库操作,然后抽点时间整理一下EasyUI的内容. 这里我们就以一个简洁的电话簿软件为基础,具体地说一下datagrid应用吧 datagr ...
- kali linux 系列教程之metasploit 连接postgresql可能遇见的问题
kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂 目录 kali linux 下metasploit 连接postgresql可能遇见的问题. ...
- kali Linux系列教程之BeFF安装与集成Metasploit
kali Linux系列教程之BeFF安装与集成Metasploit 文/玄魂 kali Linux系列教程之BeFF安装与集成Metasploit 1.1 apt-get安装方式 1.2 启动 1. ...
随机推荐
- PyQt4简单小demo
#coding=utf-8 import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class FontPropertiesDl ...
- 线性代数-矩阵-【5】矩阵化简 C和C++实现
点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html [2]矩阵生成:http://www.cnblogs.com/ ...
- redis 介绍和常用命令
redis 介绍和常用命令 redis简介 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键 ...
- C# 匿名对象(匿名类型)、var、动态类型 dynamic
本文是要写的下篇<C#反射及优化用法>的前奏,不能算是下一篇文章的基础的基础吧,有兴趣的朋友可以关注一下. 随着C#的发展,该语音内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑. ...
- 两台主机之间单向Ping不通的问题
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 ...
- 1092: 最大价值(dollars) 算法 动态规划
题目地址:http://www.hustoj.com/oj/problem.php?id=1092 题目描述 Dave以某种方法获取了未来几天美元对德国马克的兑换率.现在Dave只有100美元,请编程 ...
- Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)
注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...
- 通过createObjectURL实现图片预览
实现原理:通过createObjectURL 创建一个临时指向某地址的二进制对象. 过程:点击触发隐藏的 input file 的点击事件,使用createObjectURL读取 file,创建 ...
- MPLS VPN随堂笔记1
MPLS VPN 基础 1.MPLS vpn架构的特点 1.1.允许不同CE传递相同私网路由 1.2.SP内部(所有P路由器)不需要学习CE路由 1.3.无安全保障但有带宽保障(跟SP租用服务) 2. ...
- Windbg DUMP
Windbg DUMP分析(原创汇总) 1. 引入篇 1.1 下载安装 1.2 调试器 1.3 操作界面2. 命令篇 2.1 按照来源划分 2.1.1 基本命令 2.1.2 元命令 2.1.3 扩展命 ...