Pytorch:内部结构
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:内部结构相关推荐
- 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-1-Tensor
参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 Tensor Tensor可以是一个数 ...
- 【小白学PyTorch】17.TFrec文件的创建与读取
[机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 小白学PyTorch | 16 TF2读取图片的方法 小白学PyTorch | 15 TF2实现一个简单的服装分 ...
- Github 1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch
©作者 | 机器之心编辑部 来源 | 机器之心 在机器学习领域,大家可能对 TensorFlow 和 PyTorch 已经耳熟能详,但除了这两个框架,一些新生力量也不容小觑,它就是谷歌推出的 JAX. ...
- pytorch微调bert_北大、人大联合开源工具箱UER,3 行代码完美复现BERT、GPT
本文由AI研习社用户张正投稿,来稿见文末联系方式 作者 | 张正 单位 | 清华大学 编辑 | Camel 现存的预训练模型中没有一种可以完美的适用于所有任务,这也给预训练模型的选择带来困难. 对于这 ...
- PyTorch基础(part4)
学习笔记,仅供参考,有错必纠 文章目录 PyTorch 基础 MNIST数据识别 常用代码 导包 载入数据 定义网络结构 PyTorch 基础 MNIST数据识别 常用代码 # 支持多行输出 from ...
- Step-by-step to Transformer:深入解析工作原理(以Pytorch机器翻译为例)
大家好,我是青青山螺应如是,大家可以叫我青青,工作之余是一名独立摄影师.喜欢美食.旅行.看展,偶尔整理下NLP学习笔记,不管技术文还是生活随感,都会分享本人摄影作品,希望文艺的技术青年能够喜欢~~如果 ...
- PyTorch框架学习十五——可视化工具TensorBoard
PyTorch框架学习十五--可视化工具TensorBoard 一.TensorBoard简介 二.TensorBoard安装及测试 三.TensorBoard的使用 1.add_scalar() 2 ...
- ResNet及其变种的结构梳理、有效性分析与代码解读(PyTorch)
点击我爱计算机视觉标星,更快获取CVML新技术 本文来自知乎,作者费敬敬,现为同济大学计算机科学与技术硕士. https://zhuanlan.zhihu.com/p/54289848 温故而知新,理 ...
- Github1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch
点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源!可打印版本附pdf下载链接 J ...
最新文章
- 19行关键代码,带你轻松入门PaddlePaddle单机训练
- python保存代码_python操作文件读写新增保存代码
- 【Python】函数的可变可选参数传递及返回值
- jquery 动态添加一行数据,支持动态删除
- 分组框控件 1130
- DLL初步和钩子入门
- Visio2016激活工具
- mysql 使用异步io_InnoDB引擎之-异步IO(Async IO)
- Java面向对象编程 实验报告
- 小学生数据分析《西游记》发现大BUG
- python 下载公众号文章_最便捷的微信公众号文章下载器——基于Python爬虫微信文章...
- Autovue集成全过程
- STM32CUBEIDE配置FreeRTOS
- Android的公交线路查询系统
- ElasticSearch~received plaintext http traffic on an https channel, closing connection Netty4HttpChan
- 知识点摘抄:数字后面+UL是什么?
- 字节跳动面试题(四)
- matplotlib从折线图入门并解决中文乱码
- java 扰码工具_【Developer Log】ProGuard扰码可执行JAR包
- 云计算机房管理,云计算在机房管理中的应用前景研究
热门文章
- tf.Variable、tf.get_variable、tf.variable_scope、tf.name_scope、random、initializer
- bzoj1770: [Usaco2009 Nov]lights 燈(折半搜索)
- 后端根据查询条件生成excel文件返回给前端,vue进行下载
- vue:webpack + vue-cil 中 proxyTable 处理跨域
- 在xcode 项目 中针对 单个文件关闭或者打开ARC 开关
- 让谷歌、百度最快最多地收录您的网站
- 【maven】maven的介绍
- Linux操作系统的诞生及主要特性
- 手把手教你VMware 安装 CentOS
- oracle数据库6月之后的数据,Oracle数据库SCN存在可能在2019年6月导致宕机问题