维度扩展

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. ansible中的playbook脚本的介绍与使用

    playbook的数据结构,遵循yaml 后缀名为yaml或者yml,这两个后缀名没有区别 字典{key:value} 列表[]或者- - alex - wusir - yantao - yuchao ...

  2. 是时候使用 YAML 来做配置或数据文件了

    概述 我们做程序,经常需要用到配置信息,回顾一下这么多年的搬砖生涯,我记得用过多种格式的文件来定义配置信息,例如 ini文件,xml文件,或者现在比较流行的 json 文件. 这些年虽然云计算和云原生 ...

  3. redis 2 主从和哨兵

    主从: 概念:将一台redis服务器数据复制到其他redis服务器,前者是master,后者是slave.数据复制是单向,从主节点复制到从节点.master以写为主,slave以读为主一个zhu主节点 ...

  4. 【算法】选择排序(Selection Sort)(二)

    选择排序(Selection Sort) 选择排序(Selection-sort)是一种简单直观的排序算法.它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余 ...

  5. BZOJ4713 迷失的字符串 解题报告

    BZOJ4713 题目大意:有 \(n\) 个点 \(n-1\) 条边,每条边有一个字符.给你 \(m\) 个字符串 \(s_i\),问每个字符串是否可以通过树上的一条简单路径表示. \(n,m\le ...

  6. Public Round #1

    传送门 [PR #1]删数 题意:写的很清楚了,略 思路: 首先转化为差分数组,两个连续数相同,删掉,乘二放进去. 发现能互相转化的两个数,符号,值\(/lowbit\)都一样. 把能相互转化的数归为 ...

  7. 基于“均态分布”随机数算法的一次性口令OneTimePassword(原创)

    /* 所谓均态分布随机数算法是指:每个数(整数或实数)无序地分布在数轴上,值只出现一次永不重复.体现了香农的一次一密理论. * 均体现在每个数的值是平均概率,即都有出现:态体现在每个数在数轴上的位置是 ...

  8. Prometheus 四种metric类型

    Prometheus的4种metrics(指标)类型: Counter Gauge Histogram Summary 四种指标类型的数据对象都是数字,如果要监控文本类的信息只能通过指标名称或者 la ...

  9. 前端1HTML

    内容概要 前端简介 HTTP简介 HTTP协议 HTML简介 head内常见标签 body内基本标签 body内特殊符号 body内常见标签 列表标签 表格标签 内容详情 前端简介 # 1.什么是前端 ...

  10. 关闭StackExchange等平台的privacy收集窗口

    技术背景 当我们打开一个StackExchange页面的时候,经常会出现一个很大的privacy收集窗口,而且不管怎么点都关闭不了,比如像下图这样: 如果屏幕足够大,影响可能也不是很大,但是关键是对于 ...