3.1.3 内部结构

tensor的数据结构如图3-1所示。tensor分为头信息区(Tensor)和存储区(Storage),信息区主要保存着tensor的形状(size)、步长(stride)、数据类型(type)等信息,而真正的数据则保存成连续数组。由于数据动辄成千上万,因此信息区元素占用内存较少,主要内存占用则取决于tensor中元素的数目,也即存储区的大小。

一般来说一个tensor有着与之相对应的storage, storage是在data之上封装的接口,便于使用,而不同tensor的头信息一般不同,但却可能使用相同的数据。下面看两个例子。

In [106]:

a = t.arange(0, 6)
a.storage()

Out[106]:

 012345
[torch.LongStorage of size 6]

In [107]:

b = a.view(2, 3)
b.storage()

Out[107]:

 012345
[torch.LongStorage of size 6]

In [108]:

# 一个对象的id值可以看作它在内存中的地址
# storage的内存地址一样,即是同一个storage
id(b.storage()) == id(a.storage())

Out[108]:

True

In [109]:

# a改变,b也随之改变,因为他们共享storage
a[1] = 100
b

Out[109]:

tensor([[  0, 100,   2],[  3,   4,   5]])

In [110]:

c = a[2:]
c.storage()

Out[110]:

 01002345
[torch.LongStorage of size 6]

In [111]:

c.data_ptr(), a.data_ptr() # data_ptr返回tensor首元素的内存地址
# 可以看出相差8,这是因为2*4=8--相差两个元素,每个元素占4个字节(float)

Out[111]:

(61277776, 61277760)

In [112]:

c[0] = -100 # c[0]的内存地址对应a[2]的内存地址
a

Out[112]:

tensor([   0,  100, -100,    3,    4,    5])

In [113]:

d = t.LongTensor(c.storage())
d[0] = 6666
b

Out[113]:

tensor([[6666,  100, -100],[   3,    4,    5]])

In [114]:

# 下面4个tensor共享storage
id(a.storage()) == id(b.storage()) == id(c.storage()) == id(d.storage())

Out[114]:

True

In [115]:

a.storage_offset(), c.storage_offset(), d.storage_offset()

Out[115]:

(0, 2, 0)

In [116]:

e = b[::2, ::2] # 隔2行/列取一个元素
id(e.storage()) == id(a.storage())

Out[116]:

True

In [117]:

b.stride(), e.stride()

Out[117]:

((3, 1), (6, 2))

In [118]:

e.is_contiguous()

Out[118]:

False

可见绝大多数操作并不修改tensor的数据,而只是修改了tensor的头信息。这种做法更节省内存,同时提升了处理速度。在使用中需要注意。 此外有些操作会导致tensor不连续,这时需调用tensor.contiguous方法将它们变成连续的数据,该方法会使数据复制一份,不再与原来的数据共享storage。 另外读者可以思考一下,之前说过的高级索引一般不共享stroage,而普通索引共享storage,这是为什么?(提示:普通索引可以通过只修改tensor的offset,stride和size,而不修改storage来实现)。

Pytorch:内部结构相关推荐

  1. 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-1-Tensor

    参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 Tensor Tensor可以是一个数 ...

  2. 【小白学PyTorch】17.TFrec文件的创建与读取

    [机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 小白学PyTorch | 16 TF2读取图片的方法 小白学PyTorch | 15 TF2实现一个简单的服装分 ...

  3. Github 1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch

    ©作者 | 机器之心编辑部 来源 | 机器之心 在机器学习领域,大家可能对 TensorFlow 和 PyTorch 已经耳熟能详,但除了这两个框架,一些新生力量也不容小觑,它就是谷歌推出的 JAX. ...

  4. pytorch微调bert_北大、人大联合开源工具箱UER,3 行代码完美复现BERT、GPT

    本文由AI研习社用户张正投稿,来稿见文末联系方式 作者 | 张正 单位 | 清华大学 编辑 | Camel 现存的预训练模型中没有一种可以完美的适用于所有任务,这也给预训练模型的选择带来困难. 对于这 ...

  5. PyTorch基础(part4)

    学习笔记,仅供参考,有错必纠 文章目录 PyTorch 基础 MNIST数据识别 常用代码 导包 载入数据 定义网络结构 PyTorch 基础 MNIST数据识别 常用代码 # 支持多行输出 from ...

  6. Step-by-step to Transformer:深入解析工作原理(以Pytorch机器翻译为例)

    大家好,我是青青山螺应如是,大家可以叫我青青,工作之余是一名独立摄影师.喜欢美食.旅行.看展,偶尔整理下NLP学习笔记,不管技术文还是生活随感,都会分享本人摄影作品,希望文艺的技术青年能够喜欢~~如果 ...

  7. PyTorch框架学习十五——可视化工具TensorBoard

    PyTorch框架学习十五--可视化工具TensorBoard 一.TensorBoard简介 二.TensorBoard安装及测试 三.TensorBoard的使用 1.add_scalar() 2 ...

  8. ResNet及其变种的结构梳理、有效性分析与代码解读(PyTorch)

    点击我爱计算机视觉标星,更快获取CVML新技术 本文来自知乎,作者费敬敬,现为同济大学计算机科学与技术硕士. https://zhuanlan.zhihu.com/p/54289848 温故而知新,理 ...

  9. Github1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源!可打印版本附pdf下载链接 J ...

最新文章

  1. 19行关键代码,带你轻松入门PaddlePaddle单机训练
  2. python保存代码_python操作文件读写新增保存代码
  3. 【Python】函数的可变可选参数传递及返回值
  4. jquery 动态添加一行数据,支持动态删除
  5. 分组框控件 1130
  6. DLL初步和钩子入门
  7. Visio2016激活工具
  8. mysql 使用异步io_InnoDB引擎之-异步IO(Async IO)
  9. Java面向对象编程 实验报告
  10. 小学生数据分析《西游记》发现大BUG
  11. python 下载公众号文章_最便捷的微信公众号文章下载器——基于Python爬虫微信文章...
  12. Autovue集成全过程
  13. STM32CUBEIDE配置FreeRTOS
  14. Android的公交线路查询系统
  15. ElasticSearch~received plaintext http traffic on an https channel, closing connection Netty4HttpChan
  16. 知识点摘抄:数字后面+UL是什么?
  17. 字节跳动面试题(四)
  18. matplotlib从折线图入门并解决中文乱码
  19. java 扰码工具_【Developer Log】ProGuard扰码可执行JAR包
  20. 云计算机房管理,云计算在机房管理中的应用前景研究

热门文章

  1. tf.Variable、tf.get_variable、tf.variable_scope、tf.name_scope、random、initializer
  2. bzoj1770: [Usaco2009 Nov]lights 燈(折半搜索)
  3. 后端根据查询条件生成excel文件返回给前端,vue进行下载
  4. vue:webpack + vue-cil 中 proxyTable 处理跨域
  5. 在xcode 项目 中针对 单个文件关闭或者打开ARC 开关
  6. 让谷歌、百度最快最多地收录您的网站
  7. 【maven】maven的介绍
  8. Linux操作系统的诞生及主要特性
  9. 手把手教你VMware 安装 CentOS
  10. oracle数据库6月之后的数据,Oracle数据库SCN存在可能在2019年6月导致宕机问题