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),只不过语法稍有区别。

:两者都可以获得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

Original: https://www.cnblogs.com/jack-nie-23/p/16479399.html
Author: jacknie23
Title: Pytorch Tensor 维度的扩充和压缩

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582394/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 1:文件与目录

    CD 切换当前工作目录 mkdir 创建目录 re -dir 删除目录 pwd 打印当前工作目录 绝对路径和相对路径 硬链接 和软链接 CP拷贝 MV 移动 dirname 和 b…

    Linux 2023年6月7日
    0137
  • 【原创】Linux虚拟化KVM-Qemu分析(八)之virtio初探

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    095
  • shell运算符

    算术运算符 下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20: 运算符说明举例 + 加法 expr $a + $b 结果为 30。 – 减法 ex…

    Linux 2023年5月27日
    072
  • 随便侃侃博客挖坑的事

    很多都没有写博客了,说实在的,Markdown的语法都忘的差不多了。 今年看着停留在提醒上的写博客计划,然后又想了想要写的东西,太多了,都需要花点时间去总结,感觉静不下心来,真的无…

    Linux 2023年6月6日
    099
  • [Git系列] 前言

    Git 简介 Git 是一个重视速度的分布式版本控制和代码管理系统,最初是由 Linus Torvalds 为开发 Linux 内核而设计并开发的,是一款遵循二代 GUN 协议的免…

    Linux 2023年6月14日
    0103
  • 【转】高并发下秒杀商品,你必须知道的9个细节

    0.前言 高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。 秒杀一般出现在商城的促销活动中,指定…

    Linux 2023年6月13日
    082
  • 辗转相除法:(求最大公约数)

    辗转相除法:(最大公约数)又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除…

    Linux 2023年6月7日
    0108
  • HTS恢复检查脚本

    #!/bin/bash #program:HTS-A数据库和插件检查 #author:sundz #version 20220531 v1 创建脚本 生成sql的表和字段汇总;ab…

    Linux 2023年6月7日
    091
  • 配置管理docker对象和守护进程

    使用 Docker 的主要工作是创建和使用各类对象:镜像、容器、网络、卷等。 1、Docker对象的标记 标记(Label):是一种将元数据应用于Docker对象(镜像、容器、网络…

    Linux 2023年6月8日
    082
  • cobbler

    cobbler cobbler cobbler简介 cobbler工作原理 cobbler的作用 cobbler服务端部署 cobbler简介 Cobbler是一个Linux服务器…

    Linux 2023年6月6日
    094
  • 你的团队工作量饱和吗?

    参与软件开发的相关人员,虽然称为工程技术人员,但本质上其实就是手艺人。手艺嘛肯定是一技之长,里面多少有些门道,外行人做不了, 也很难完全搞清楚其中的门道,合作过程中就怕被坑上当 :…

    Linux 2023年6月13日
    086
  • Redis安装及配置

    Linux Redis 安装教程 1 安装 下载安装包 官网下载链接我下载的版本是 redis-4.0.9.tar.gz 将下载的安装包上传到服务器(建议到/home/redis)…

    Linux 2023年6月7日
    0111
  • Xbox无法进入开发者模式

    从2020.09.01起,Xbox的dev mode app估计是证书过期或者其他系统配置问题,导致大量开发者无法进入开发者模式,具体如下图所示。 针对上述问题,可以通过微软预先设…

    Linux 2023年6月13日
    0242
  • 软件定义网络第一次作业

    配置结果 如何pip解决下载过慢问题 实验环境配置 环境安装截图如下 安装环境过程中一些问题的解决 github连接不上 在hosts文件中加上以下语句 140.82.114.3 …

    Linux 2023年6月7日
    0102
  • SpringSecurity

    1、环境搭建 1、导包,使用maven搭建项目 2、关闭thymeleaf缓存 3、导入静态资源和相应页面代码 4、建立controller层 2、权限与认证 运用了 Aop 切面…

    Linux 2023年6月14日
    082
  • srec_cat 常用参数的使用

    下面介绍映像文件工具 srec_cat 的使用,如何通过相关参数实现自己需要的功能。 文件类型 在输入文件和输出文件文件时要指明文件类型,常用的如: test.hex -intel…

    Linux 2023年6月7日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球