Pytorch基础之张量的存储方式及维度操作:size,shape,view,reshape,contiguous
参考书目:张校捷,《深入浅出PyTorch:从模型到源码》
Pytorch中张量的存储
假设存在一个k维张量,其维数为[ n 1 , n 2 . . . n k n_1,n_2...n_k n1,n2...nk],在计算机的实际存储过程中为一个1维的向量,向量的大小为 n 1 ∗ n 2 ∗ . . . ∗ n k n_1*n_2*...*n_k n1∗n2∗...∗nk。在读取张量某一位置的元素数据时,假设此元素的下标为 ( k 1 , k 2 . . . k k ) (k_1,k_2...k_k) (k1,k2...kk),则在读取时读取的是内存中第 i 1 ∗ ( n 2 ∗ . . . ∗ n k ) + i 2 ∗ ( n 3 ∗ . . . ∗ n k ) + . . . + i k − 1 ∗ n k + i k i_1*(n_2*...*n_k)+i_2*(n_3*...*n_k)+...+i_{k-1}*n_k+i_k i1∗(n2∗...∗nk)+i2∗(n3∗...∗nk)+...+ik−1∗nk+ik位置的数据,其中 ( n 2 ∗ . . . ∗ n k ) , ( n 3 ∗ . . . ∗ n k ) , n k , 1 (n_2*...*n_k), (n_3*...*n_k), n_k,1 (n2∗...∗nk),(n3∗...∗nk),nk,1称为对应维度的步长(Stride)或者系数(Offset)。例如下表为一 2 ∗ 2 ∗ 4 2*2*4 2∗2∗4张量在内存中的存储。
000 | 001 | 002 | 003 | 010 | 011 | 012 | 013 | 100 | 101 | 102 | 103 | 110 | 111 | 112 | 113 |
---|
Pytorch中张量维度大小与数目的获取
在pytorch中对张量tensor
维度及维度数目的获取可以有以下方法:ndimension
方法可以获取张量的维数,nelement
方法可以获取张量总的元素个数。想要获得张量的每个维度的大小,也就是张量的形状信息,可以通过tensor.size()
或者tensor.shape
得到。这两者不同的是tensor.szie()
调用的是方法,tensor.shape
访问的是张量的属性。相同的是两者返回的结果的数据类型都为torch.Size
。想要获得特定维度的大小可以在使用size方法时输入想要的维度。
tensor0=torch.randn(1,3,28,28)
tensor0.ndimension(),tensor0.nelement()
Out[4]: (4, 2352)tensor0.size(),tensor0.shape,tensor0.size(1)
Out[5]: (torch.Size([1, 3, 28, 28]), torch.Size([1, 3, 28, 28]), 3)
Pytorch中张量维度变换
在Pytorch中想要对张量的维度进行改变主要采用的方法时view
方法和reshape
方法。他们的作用都是将原有张量转换为想要的形状大小,前提是张量的元素总量保持一致,当view()或reshape()方法的输入中某一维度为-1时,作用是将这一维度的元素数量设为活动值,具体数值由其他维度确定例如
tensor0.view(1,-1,28).shape
Out[7]: torch.Size([1, 84, 28])
tensor0.reshape(1,-1,28).shape
Out[8]: torch.Size([1, 84, 28])
这里-1对应的维度的元素个数就是 ( 1 ∗ 3 ∗ 28 ∗ 28 ) / ( 1 ∗ 28 ) = 84 (1*3*28*28)/(1*28)=84 (1∗3∗28∗28)/(1∗28)=84的结果
view
方法与reshape
方法的不同之处在于view
方法不改变张量底层的数据,只改变维度的步长信息。在使用view
方法之后使用contiguous
可以重新生成一个张量。使用reshape()
方法直接对底层数据进行了更改相当于先后调用了view()
方法和contiguous
方法。
contiguous
方法的作用是应对张量的步长和维度不兼容时的方法,同样也常用于narrow()
,expand()
,transpose()
和permute()
这种只改变维度步长信息而不改变底层数据本身的方法之后,不然可能出现报错。
Pytorch基础之张量的存储方式及维度操作:size,shape,view,reshape,contiguous相关推荐
- 【深度之眼PyTorch框架班第五期】作业打卡01:PyTorch简介及环境配置;PyTorch基础数据结构——张量
文章目录 任务名称 任务简介 详细说明 作业 1. 安装anaconda,pycharm, CUDA+CuDNN(可选),虚拟环境,pytorch,并实现hello pytorch查看pytorch的 ...
- 深度学习_TensorFlow2.0基础_张量创建,运算,维度变换,采样
Tensorflow2.0 基础 一:TensorFlow特性 1.TensorFlow An end-to-end open source machine learning platform end ...
- Pytorch ——基础指北_肆 [构建数据集与操作数据集]
Pytorch --基础指北_肆 系列文章目录 Pytorch --基础指北_零 Pytorch --基础指北_壹 Pytorch --基础指北_贰 Pytorch --基础指北_叁 文章目录 Pyt ...
- pytorch2——Pytorch基础数据结构——张量(深度之眼)
前情提要 在上一篇文章中,我们详细介绍了如何搭建一个pytorch的环境,那么本篇文章我们即将揭开pytorch的神秘面纱,了解pytorch中的数据结构--Tensor. 概念问答 张量是什么? 张 ...
- PostgreSQL 修改文本类型字段的存储方式
参考资料 PostgreSQL存储方式分为以下4种: PLAIN避免压缩或者线外存储:而且它禁用变长类型的单字节头部.这是不可TOAST数据类型列的唯一可能的策略.只是对那些不能TOAST的数据类型才 ...
- PyTorch基础(一)-----张量(Tensor)
前言 很多人都会拿PyTorch和Google的Tensorflow进行比较,这个肯定是没有问题的,因为他们是最火的两个深度学习框架了.但是说到PyTorch,其实应该先说Torch. 什么是Torc ...
- Pytorch基础操作 —— 11. 改变张量的维度(维度修改)
文章目录 torch.reshape 例程 Function Description Detail reshape Returns a tensor with the same data and nu ...
- 计算机基础-------磁盘数据存储方式的解析
硬盘存储数据 我们知道硬盘读取信息是通过机械臂的摆动和盘片转动找到所需要的数据首地址所在地址块进行读取. 我们先说一下磁道上的块,这里需要引出一个名词-----簇:"簇"是 DOS ...
- pytorch基础一:张量
简单记录以便查阅 张量 一.创建张量 x = torch.empty(5,3) # 创建未初始化矩阵张量 x = torch.rand(5,3) # 创建初始化随机矩阵张量 x = torch.zer ...
最新文章
- python调用通达信函数_python获取通达信基本数据源码
- python查看函数定义_从函数内函数定义看python的函数实现
- 【未完待续】Git个人solo实际常用命令
- 网站重启服务器有啥好处,常规服务器重启的好处和障碍
- java 绘图球的移动_求助在JFrame上绘制移动的小球
- [转]VisualStudio如何组织解决方案的目录结构
- 活到老,学到老!各大厂数据库技术解决方案来了
- sar偏移量追踪技术_SAR指标配合阶段高低价的量化交易策略
- NSString的retainCount
- 《算法图解》第九章 动态规划
- Tomcat热部署三种方式的详细说明
- G_O_R加速器仿真之计算原理
- 科研绘图,看这一篇就够了(内含免费送书活动)
- face_recognition小实战:显示未知图片中已知人物的脸
- 解释一下什么是鲁棒性
- unsigned char型整数
- 2783: 魔法药水【二分】
- R(2)时间序列分析及应用之TSA安装(R语言)
- IOS手机安装旧版APP(不要问我为什么安装旧版,有的旧版功能更强大)
- HCIP H12-221 题库 71-120题 讲解