pytorch学习笔记(九):PyTorch结构介绍

PyTorch结构介绍

对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握。水平有限,如有错误,欢迎指错,谢谢!

几个重要的类型

和数值相关的

  • Tensor
  • Variable
  • Parameter
  • buffer(这个其实不能叫做类型,其实他就是用来保存tensor的)

Tensor: PyTorch中的计算基本都是基于Tensor的,可以说是PyTorch中的基本计算单元。

VariableTensor的一个Wrapper,其中保存了Variable的创造者,Variable的值(tensor),还有Variable的梯度(Variable)。

自动求导机制的核心组件,因为它不仅保存了 变量的值,还保存了变量是由哪个op产生的。这在反向传导的过程中是十分重要的。

Variable的前向过程的计算包括两个部分的计算,一个是其值的计算(即,Tensor的计算),还有就是Variable标签的计算。标签指的是什么呢?如果您看过PyTorch的官方文档 Excluding subgraphs from backward 部分的话,您就会发现Variable还有两个标签:requires_gradvolatile。标签的计算指的就是这个。

Parameter: 这个类是Variable的一个子集,PyTorch给出这个类的定义是为了在Module(下面会谈到)中添加模型参数方便。

模型相关的

  • Function
  • Module

Function: 如果您想在PyTorch中自定义OP的话,您需要继承这个类,您需要在继承的时候复写forwardbackward方法,可能还需要复写__init__方法(由于篇幅控制,这里不再详细赘述如果自定义OP)。您需要在forward中定义OP,在backward说明如何计算梯度。 关于Function,还需要知道的一点就是,Functionforwardbackward方法中进行计算的类型都是Tensor,而不是我们传入的Variable。计算完forward和backward之后,会包装成Varaible返回。这种设定倒是可以理解的,因为OP是一个整体嘛,OP内部的计算不需要记录creator

Module: 这个类和Function是有点区别的,回忆一下,我们定义Function的时候,Funciton本身是不需要变量的,而Module是变量和Function的结合体。在某些时候,我们更倾向称这种结构为Layer。但是这里既然这么叫,那就这么叫吧。

Module实际上是一个容器,我们可以继承Module,在里面加几个参数,从而实现一个简单全连接层。我们也可以继承Module,在里面加入其它Module,从而实现整个VGG结构。

关于hook

PyTorch中注册的hook都是不允许改变hook的输入值的 下面对PyTorch中出现hook的地方做个总结: * Module : register_forward_hook, register_backward_hook 注意:forward_hook不能用来修改Module的输出值,它的功能就像是安装个监视器一样。我们可以用forward_hook和visdom来监控我们Module的输出。backward_hook和与Variable的功能是类似的,将和Variableregister_hook一起介绍。

  • Variable: register_hook Variable的register_hook注册的是一个backward hookbackward hook是在BP的过程中会用到的。可以用它来处理计算的梯度。

关于hook较为详尽的介绍

foward过程与backward过程

forward 以一个Module为例: 1. 调用module的call方法 2. modulecall里面调用moduleforward方法 3. forward里面如果碰到Module的子类,回到第1步,如果碰到的是Function的子类,继续往下 4. 调用Functioncall方法 5. Functioncall方法调用了Function的forward方法。 6. Functionforward返回值 7. moduleforward返回值 8. 在modulecall进行forward_hook操作,然后返回值。

backward 关于backward

总结

PyTorch基本的操作是OP,被操作数是Tensor

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python

二、爬虫基础库

request模块 安装 1 pip install requests 简单使用   import requests respo...

2349
来自专栏华章科技

令人困惑的TensorFlow!谷歌大脑工程师帮你解决麻烦

导读:虽然对于大多数人来说 TensorFlow 的开发语言是 Python,但它并不是一个标准的 Python 库。这个神经网络框架通过构建「计算图」来运行,...

1333
来自专栏Aloys的开发之路

C语言中随机数相关问题

用C语言产生随机数重要用到rand函数、srand函数、及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明。 int rand(void)...

1818
来自专栏机器之心

PyTorch为何如此高效好用?来探寻深度学习框架的内部架构

选自blog.christianperone 作者:Christian S. Perone 机器之心编译 参与:思源、黄小天、李泽南 作为 Facebook 人...

3556
来自专栏机器之心

令人困惑的TensorFlow!

我叫 Jacob,是 Google AI Resident 项目的研究学者。我是在 2017 年夏天加入该项目的,尽管已经拥有了丰富的编程经验,并且对机器学习的...

1173
来自专栏大数据

概率数据结构简介

在处理大型的数据集时,我们常常进行一些简单的检查,如稀有项(Unique items)的数量、最常见的项,以及数据集中是否存在某些指定的项。通常的做法是使用某种...

2866
来自专栏机器学习原理

深度学习(1)——tensorflow简介什么是TensorFlow?什么是数据流图?安装基本概念示例变量的更新操作

2423
来自专栏量子位

TensorFlow全新的数据读取方式:Dataset API入门教程

作者:何之源 首发于知乎专栏:AI Insight 量子位 已获授权编辑发布 转载请联系原作者 Dataset API是TensorFlow 1.3版本中引入的...

3459
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(二)。

      相关链接: 高斯模糊算法的全面优化过程分享(一)      在高斯模糊算法的全面优化过程分享(一)一文中我们已经给出了一种相当高性能的高斯模糊过程,...

3196
来自专栏Fish

《GPU高性能编程 CUDA实战》(CUDA By Example)读书笔记

写在最前 这本书是2011年出版的,按照计算机的发展速度来说已经算是上古书籍了,不过由于其简单易懂,仍旧被推荐为入门神书。先上封面: ? 由于书比较...

2605

扫码关注云+社区