Pytorch Tensor 维度的扩充和压缩
维度扩展
x.unsqueeze(n)
在 n 号位置添加一个维度
例子:
import torch
x = torch.rand(3,2)
x1 = x.unsqueeze(0)		# 在第一维的位置添加一个维度
x2 = x.unsqueeze(1)		# 在第二维的位置添加一个维度
x3 = x.unsqueeze(2)		# 在第三维的位置添加一个维度
print(x1.shape)
print(x2.shape)
print(x3.shape)
>> torch.Size([1, 3, 2])
>> torch.Size([3, 1, 2])
>> torch.Size([3, 2, 1])
由上面的例子可见,tensor.unsqueeze(n) 可以很方便的为tensor添加一个维度,那么是不是可以在tensor的任意维度上添加一个维度呢,答案是否定的,即参数 n 存在范围,n 位于 [-(dim+1), dim]; 其中 dim为tensor的维度的个数,比如在上例中,tensor x 的dim = 2, 即在上例中 n 不位于 [-3, 2] 时会报错。如下:
import torch
x = torch.rand(3,2)
x1 = x.unsqueeze(3)
x2 = x.unsqueeze(-4)
print(x1.shape)
print(x2.shape)
>> IndexError: Dimension out of range (expected to be in range of [-3, 2], but got 3)
>> IndexError: Dimension out of range (expected to be in range of [-3, 2], but got -4)
没错,n 的值还能是负数,其负数表示的是在从右往左的 |n| 的维数上增加一维,例:
import torch
x = torch.rand(3,2)
x1 = x.unsqueeze(-1)
x2 = x.unsqueeze(-2)
print(x1.shape)
print(x2.shape)
>> torch.Size([3, 2, 1])
>> torch.Size([3, 1, 2])
此外还有一种语法的变体torch.unsqueeze(x,n) , 作用同 x.unsqueeze(n),都表示在第n位的位置添加1维,只不过语法稍有区别。
维度压缩
x.squeeze(n)
对 第 n 维 的位置进行维度压缩,如果该位置的维度值为1 ,则压缩,否则不进行任何操作。而当不设置 参数 n 时 即:x.squeeze() ,则对tensor x 的所有维度值为1的维度进行压缩,而其余不为1 的维度不进行处理。如下:
import torch
x = torch.rand(3,2,1)
x1 = x.squeeze(2)		# n号位置上的维度为1。 压缩
x2 = x.squeeze(1)		# n号位置上的维度不为1。 不处理
x3 = x.unsqueeze(0)
x3 = x3.squeeze()		# 对tensor x3 的所有维度为1的维度压缩
>> torch.Size([3, 2])
>> torch.Size([3, 2, 1])
>> torch.Size([3, 2])
同样的,与 unsqueeze() 一样,squeeze(n) 的 参数 n 一样存在范围,且均为  [-(dim+1), dim]; 其中 dim为tensor的维度的个数,在上例中,tensor x 的dim = 2。当n超过这个范围时就会报错。如下:
import torch
x = torch.rand(3,2,1)
x1 = x.squeeze(4)
print(x1)
>> IndexError: Dimension out of range (expected to be in range of [-3, 2], but got 4)
也同样的,此外还有一种语法的变体torch.squeeze(x,n) , 作用同 x.squeeze(n),都表示在第n位的位置压缩维度(如果该位置维度为1),只不过语法稍有区别。
Tips -- .size() 和 .shape 的异同
同:两者都可以获得tensor的维度大小:
import torch
x = torch.rand(3,2,1)
print(x.shape)
print(x.size())
>> torch.Size([3, 2, 1])
>> torch.Size([3, 2, 1])
异: shape 是一个Tensor类中的属性,作为Tensor类的实例可以直接通过 . 的方式获得shape属性,即获得tensor的维度的大小;
size() 是 Tensor类继承来的无参方法,所以其要带小括号,Tensor类的实例也可以调用类的成员方法。
另外,在 python 的库 numpy 中,size和shape 是numpy中的函数,size()计算矩阵中所有元素的个数;shape()返回矩阵的维度值。如下:
import numpy as np
x = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(np.shape(x))
print(np.size(x))
print(x.shape[0])	# 显示矩阵的行数
>> (3, 3)
>> 9
>> 3
												
											Pytorch Tensor 维度的扩充和压缩的更多相关文章
- pytorch tensor 维度理解.md
		
torch.randn torch.randn(*sizes, out=None) → Tensor(张量) 返回一个张量,包含了从标准正态分布(均值为0,方差为 1)中抽取一组随机数,形状由可变参数 ...
 - pytorch 中改变tensor维度的几种操作
		
具体示例如下,注意观察维度的变化 #coding=utf-8 import torch """改变tensor的形状的四种不同变化形式""" ...
 - [TensorFlow]Tensor维度理解
		
http://wossoneri.github.io/2017/11/15/[Tensorflow]The-dimension-of-Tensor/ Tensor维度理解 Tensor在Tensorf ...
 - tensorflow中的函数获取Tensor维度的两种方法:
		
获取Tensor维度的两种方法: Tensor.get_shape() 返回TensorShape对象, 如果需要确定的数值而把TensorShape当作list使用,肯定是不行的. 需要调用Tens ...
 - Pytorch 张量维度
		
Tensor类的成员函数dim()可以返回张量的维度,shape属性与成员函数size()返回张量的具体维度分量,如下代码定义了一个两行三列的张量: f = torch.randn(2, 3) pri ...
 - Pytorch Tensor 常用操作
		
https://pytorch.org/docs/stable/tensors.html dtype: tessor的数据类型,总共有8种数据类型,其中默认的类型是torch.FloatTensor, ...
 - Pytorch Tensor, Variable, 自动求导
		
2018.4.25,Facebook 推出了 PyTorch 0.4.0 版本,在该版本及之后的版本中,torch.autograd.Variable 和 torch.Tensor 同属一类.更确切地 ...
 - tensor维度变换
		
维度变换是tensorflow中的重要模块之一,前面mnist实战模块我们使用了图片数据的压平操作,它就是维度变换的应用之一. 在详解维度变换的方法之前,这里先介绍一下View(视图)的概念.所谓Vi ...
 - pytorch tensor的索引与切片
		
切片方式与numpy是类似. * a[:2, :1, :, :], * 可以用-1索引. * ::2,表示所有数据,间隔为2,即 start:end:step. * a.index_select(1 ...
 
随机推荐
- XCTF练习题---MISC---Recover-Deleted-File
			
XCTF练习题---MISC---Recover-Deleted-File flag:de6838252f95d3b9e803b28df33b4baa 解题步骤: 1.观察题目,下载附件 2. 根据题 ...
 - vue  package.json 详解
			
示例: { "name": "scrm", "version": "0.1.0", "private" ...
 - Mysql基本操作语句 增-删-改-查
			
增 INSERT INTO 表名(属性名1,属性名2) VALUES(值1,值2) 删 DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子 ...
 - VSCODE调试时在cygwin.S中发生段错误
			
起因: C++实现矩阵类和向量类 当看了我实现的矩阵类后,一个同学问我: 然后我就试了试1000维,结果运行时在cygwin.S里引发了奇奇怪怪的Segmentation fault,而且这个文件还是 ...
 - 微服务生态组件之Spring Cloud LoadBalancer详解和源码分析
			
Spring Cloud LoadBalancer 概述 Spring Cloud LoadBalancer目前Spring官方是放在spring-cloud-commons里,Spring Clou ...
 - Dns2tcp隧道
			
0x01 dns2tcp绕过的原理 dns2tcp是一款基于c/s架构的软件,它可以将通信报文夹藏在udp协议的TXT解析记录中,进而形成dns隧道.dns隧道通过dns2tcpc对本地端口的监听,实 ...
 - c++ web框架实现之静态反射实现
			
0 前言 最近在写web框架,框架写好后,需要根据网络发来的请求,选择用户定义的servlet来处理请求.一个问题就是,我们框架写好后,是不知道用户定义了哪些处理请求的类的,怎么办? 在java里有一 ...
 - python使用vosk进行中文语音识别
			
操作系统:Windows10 Python版本:3.9.2 vosk是一个离线开源语音识别工具,它可以识别16种语言,包括中文. 这里记录下使用vosk进行中文识别的过程,以便后续查阅. vosk地址 ...
 - AMS 新闻视频广告的云原生容器化之路
			
作者 卓晓光,腾讯广告高级开发工程师,负责新闻视频广告整体后台架构设计,有十余年高性能高可用海量后台服务开发和实践经验.目前正带领团队完成云原生技术栈的全面转型. 吴文祺,腾讯广告开发工程师,负责新闻 ...
 - 树形dp基础
			
今天来给大家讲一下数形dp基础 树形dp常与树上问题(lca.直径.重心)结合起来 而这里只讲最最基础的树上dp 1.选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程 ...