关于pytorch张量维度转换大全

news/2025/2/12 3:01:44/

关于pytorch张量维度转换大全

  • 1 tensor.view()
  • 2 tensor.reshape()
  • 3 tensor.squeeze()和tensor.unsqueeze()
    • 3.1 tensor.squeeze() 降维
    • 3.2 tensor.unsqueeze(idx)升维
  • 4 tensor.permute()
  • 5 torch.cat([a,b],dim)
  • 6 tensor.expand()
  • 7 tensor.narrow(dim, start, len)
  • 8 tensor.resize_()
  • 9 tensor.repeat()
  • 参考:

# view()    转换维度
# reshape() 转换维度
# permute() 坐标系变换
# squeeze()/unsqueeze() 降维/升维
# expand()   扩张张量
# narraw()   缩小张量
# resize_()  重设尺寸
# repeat(), unfold() 重复张量
# cat(), stack()     拼接张量

1 tensor.view()

view() 用于改变张量的形状,但不会改变张量中的元素值
用法1:
例如,你可以使用view 将一个形状是(2,3)的张量变换成(3,2)的张量;

import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = x.view(3, 2)    

上面的操作相当于,先把形状为**(2,3)的tensor展平,变成(1,6),然后再变成(3,2).**

用法2:
转换前后张量中的元素个数不变。view()中若存在某一维的维度是-1,则表示该维的维度根据总元素个数和其他维度尺寸自适应调整。注意,view()中最多只能有一个维度的维数设置成-1

z = x.view(-1,2)

image.png

举例子:
在卷积神经网络中,经常会在全连接层用到view进行张量的维度拉伸:
假设输入特征是BCH*W的4维张量,其中B表示batchsize,C表示特征通道数,H和W表示特征的高和宽,在将特征送入全连接层之前,会用.view将转换为B*(CHW)的2维张量,即保持batch不变,但将每个特征转换为一维向量。

2 tensor.reshape()

reshape()与view()使用方法相同。
image.png

3 tensor.squeeze()和tensor.unsqueeze()

3.1 tensor.squeeze() 降维

(1)若squeeze()括号内为空,则将张量中所有维度为1的维数进行压缩,如将1,2,1,9的张量降维到2,9维;若维度中无1维的维数,则保持源维度不变,如将234维的张量进行squeeze,则转换后维度不会变。
(2)若squeeze(idx),则将张量中对应的第idx维的维度进行压缩,如1,2,1,9的张量做squeeze(2),则会降维到1,2,9维的张量;若第idx维度的维数不为1,则squeeze后维度不会变化。
例如:
image.png

3.2 tensor.unsqueeze(idx)升维

在第idx维进行升维,将tensor由原本的维度n,升维至n+1维。如张量的维度维2*3,经unsqueeze(0)后,变为1,2,3维度的张量。
image.png

4 tensor.permute()

坐标系转换,即矩阵转置,使用方法与numpy array的transpose相同。permute()括号内的参数数字指的是各维度的索引值。permute是深度学习中经常需要使用的技巧,一般的会将BCHW的特征张量,通过转置转化为BHWC的特征张量,即将特征深度转换到最后一个维度,通过调用**tensor.permute(0, 2, 3, 1)**实现。
torch.transpose只能操作2D矩阵的转置,而permute()函数可以对任意高维矩阵进行转置;
简单理解:permute()相当于可以同时操作tensor的若干维度,transpose只能同时作用于tensor的两个维度。

image.png

permute和view/reshape虽然都能将张量转化为特定的维度,但原理完全不同,注意区分。view和reshape处理后,张量中元素顺序都不会有变化,而permute转置后元素的排列会发生变化,因为坐标系变化了。

5 torch.cat([a,b],dim)

在第dim维度进行张量拼接,要注意维度保持一致
假设a为h1w1的二维张量,b为h2w2的二维张量,torch.cat(a,b,0)表示在第一维进行拼接,即在列方向拼接,所以w1和w2必须相等。torch.cat(a,b,1)表示在第二维进行拼接,即在行方向拼接,所以h1和h2必须相等
假设a为c1h1w1的二维张量,b为c2h2w2的二维张量,torch.cat(a,b,0)表示在第一维进行拼接,即在特征的通道维度进行拼接,其他维度必须保持一致,即w1=w2,h1=h2。torch.cat(a,b,1)表示在第二维进行拼接,即在列方向拼接,必须保证w1=w2,c1=c2;torch.cat(a,b,2)表示在第三维进行拼接,即在行方向拼接,必须保证h1=h2,c1=c2;
image.png

6 tensor.expand()

扩展张量,通过值复制的方式,将单个维度扩大为更大的尺寸。使用expand()函数不会使原tensor改变,需要将结果重新赋值。下面是具体的实例:
以二维张量为例:tensor是1n或n1维的张量,分别调用tensor.expand(s, n)或tensor.expand(n, s)在行方向和列方向进行扩展。
expand()的填入参数是size

image.png

7 tensor.narrow(dim, start, len)

narrow()函数起到了筛选一定维度上的数据作用.

torch.narrow(input, dim, start, length)->Tensor

input是需要切片的张量,dim是切片维度,start是开始的索引,length是切片长度,实际应用如下:

image.png

8 tensor.resize_()

尺寸变化,将tensor截断为resize_后的维度.
image.png

9 tensor.repeat()

tensor.repeat(a,b)将tensor整体在行方向复制a份,在列方向上复制b份

image.png

参考:

pytorch中与tensor维度变化相关的函数(持续更新) - weili21的文章 - 知乎
https://zhuanlan.zhihu.com/p/438099006

【pytorch tensor张量维度转换(tensor维度转换)】
https://blog.csdn.net/x_yan033/article/details/104965077


http://www.ppmy.cn/news/1200821.html

相关文章

国内某发动机制造工厂RFID智能制造应用解决方案

一、工厂布局和装备 国内某发动机制造工厂的装配车间布局合理,设备先进,在这个5万平方米的生产区域内,各个工位之间流程紧密,工厂采用了柔性设备,占比达到了67%,数控化率超过90%,自动化率达到了…

如何知道是背包问题

那么什么样的问题可以被称作为背包问题?换言之,我们拿到题目如何透过题目的不同包装形式看到里面背包问题的不变内核呢? 我对背包问题定义的理解: 给定一个背包容量target,再给定一个数组nums(物品),能否按…

RISC-V处理器设计(四)—— Verilog 代码设计

一、前言 从6月底刚开始接触 risc-v 架构,到现在完成了一个 risc-v cpu 的设计,并且成功移植了 rt-thread nano 到本 cpu 上运行,中间经过了 4个多月的时间,遇到了数不清的问题,也想过放弃,但好在最后还是…

Rabbit的高可用机制

RabbitMQ是一个消息中间件,提供了多种高可用机制来确保系统在出现故障时仍能保持可用性。以下是RabbitMQ的一些高可用机制: 镜像队列(Mirrored Queues): 作用: 镜像队列可以在集群中复制队列的消息到多个节…

大语言模型研究进展综述

1、历史 自20世纪50年代图灵测试被提出以来,研究人员一直在探索和开发能够理解并掌握语言的人工智能技术。 作为重要的研究方向之一,语言模型得到了学术界的广泛研究,从早期的统计语言模型和神经语言模型开始,发展到基于Transform…

音视频报警可视对讲15.6寸管理机

音视频报警可视对讲15.6寸管理机 一、管理机技术指标: 1、15.6寸原装京东方工业液晶触摸屏,分辨率1920 (H) x 1080 (V); 2、1000M/100M自适应双网口; 4、按键设置:报警/呼叫按键,通话/挂机按键&#xff…

骨骼动画详解

【物体怎么样是在动】 当物体的位置、朝向、大小即Transform有任意一者发生变化时,物体在动。 但变化要达到一定的幅度时,我们会看到物体在动,幅度是多少却决于我们看这个物体的距离、方向,物体的朝向等因素。 这里说的幅度是指…

64位Office API声明语句第112讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…