维度扩展

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 维度的扩充和压缩的更多相关文章

  1. pytorch tensor 维度理解.md

    torch.randn torch.randn(*sizes, out=None) → Tensor(张量) 返回一个张量,包含了从标准正态分布(均值为0,方差为 1)中抽取一组随机数,形状由可变参数 ...

  2. pytorch 中改变tensor维度的几种操作

    具体示例如下,注意观察维度的变化 #coding=utf-8 import torch """改变tensor的形状的四种不同变化形式""" ...

  3. [TensorFlow]Tensor维度理解

    http://wossoneri.github.io/2017/11/15/[Tensorflow]The-dimension-of-Tensor/ Tensor维度理解 Tensor在Tensorf ...

  4. tensorflow中的函数获取Tensor维度的两种方法:

    获取Tensor维度的两种方法: Tensor.get_shape() 返回TensorShape对象, 如果需要确定的数值而把TensorShape当作list使用,肯定是不行的. 需要调用Tens ...

  5. Pytorch 张量维度

    Tensor类的成员函数dim()可以返回张量的维度,shape属性与成员函数size()返回张量的具体维度分量,如下代码定义了一个两行三列的张量: f = torch.randn(2, 3) pri ...

  6. Pytorch Tensor 常用操作

    https://pytorch.org/docs/stable/tensors.html dtype: tessor的数据类型,总共有8种数据类型,其中默认的类型是torch.FloatTensor, ...

  7. Pytorch Tensor, Variable, 自动求导

    2018.4.25,Facebook 推出了 PyTorch 0.4.0 版本,在该版本及之后的版本中,torch.autograd.Variable 和 torch.Tensor 同属一类.更确切地 ...

  8. tensor维度变换

    维度变换是tensorflow中的重要模块之一,前面mnist实战模块我们使用了图片数据的压平操作,它就是维度变换的应用之一. 在详解维度变换的方法之前,这里先介绍一下View(视图)的概念.所谓Vi ...

  9. pytorch tensor的索引与切片

    切片方式与numpy是类似. * a[:2, :1, :, :], * 可以用-1索引. * ::2,表示所有数据,间隔为2,即 start:end:step. *  a.index_select(1 ...

随机推荐

  1. C#/VB.NET 实现Word和ODT文档相互转换

    ODT文档格式一种开放文档格式(OpenDocument Text).通常,ODT格式的文件可以使用LibreOffice Writer.MS Word或其他一些文档编辑器来打开.我们在处理文档时,可 ...

  2. 实验:Python图形图像处理

    1. 准备一张照片,编写Python程序将该照片进行图像处理,分别输出以下效果的图片:(a)灰度图:(b)轮廓图: (c)变换RGB通道图:(d)旋转45度图. 2. 假设当前文件夹中data.csv ...

  3. 114_Power Pivot 销售订单之销售额、成本、利润率相关

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 双十二回来后遇到一个比较有意思的计算销售额和利润率的需求(见下文说明). 先看下效果. 结果 说明: 1.订单表 ...

  4. 2020级cpp机考模拟题A卷-#题解1

    为了各位朋友的身心健康(不是),我们按照题目难度顺序来写题解. 第一次写题解,希望多点包容和鼓励(恬不知耻 1:谁先输出-4 题意: 输入3个整数,按从大到小的顺序输出,每两个数字间加一个空格. 题解 ...

  5. Fail2ban 配置详解 配置说明

    fail2ban的配置主要由基础配置(fail2ban.conf)和监禁配置(jail.conf)两部分组成. fail2ban的配置采用标签块"[块名]"和键值"key ...

  6. vue项目|在弹窗中引入uchart图表子组件不显示

    为了解决uchart作为子组件在主组件里引用但不显示的情况,(同样适用于弹窗之中)目前有三种方法. 1-解决方式 1>如果你使用的uchart子组件是从官方拿的例子:进入到uchart子组件将o ...

  7. Linux 中递归删除文件

    递归删除当前目录下以 .json 结尾的文件 find . -name "*.json" | xargs rm -f find . -name "*.json" ...

  8. django框架4

    内容概要 编辑删除功能编写 虚拟环境 django路由层版本区别 视图函数的返回值 JsonResponse对象 form表单上传文件 request其他方法 FBV与CBV(基于函数的视图.基于类的 ...

  9. 【摸鱼神器】UI库秒变LowCode工具——列表篇(二)维护json的小工具

    上一篇介绍了一下如何实现一个可以依赖 json 渲染的列表控件,既然需要 json 文件,那么要如何维护这个 json 文件就成了重点,如果没有好的维护方案的话,那么还不如直接用UI库. 所以需要我们 ...

  10. 判断语句、if嵌套

    判断语句 上一篇我们使用了一下if语句当然我们不止这些 我们上一个只是判断出如果满足条件会执行,那么我们想一想如果不能满足该会怎么样! 当然 还有一种语句叫做if else 他的语法格式是: if ( ...