tensor之维度转换

维度转换

改变维度view

view 可以改变维度,合并拆分都可

#创建tensor变量
a=torch.rand(4,1,28,28)#4张图,1灰度图片,图片大小28*28
a.shape
#torch.Size([4, 1, 28, 28])

#将后面三个维度合并在一起,1*28*28
a.view(4,28*28).shape
#torch.Size([4, 784])

#前3个维度合并在一起
a.view(4*1*28,28).shape
#out:torch.Size([112, 28])

b=a.view(4,784)
b.view(4,28,28,1).shape#1维转4维,但此转变没有物理意义
#out:torch.Size([4, 28, 28, 1])

squeeze/unsqueeze

增加维度unsqueeze

#创建tensor变量
a=torch.rand(4,1,28,28)#4张图,1灰度图片,图片大小28*28

#在0的位置插入一个维度
a.unsqueeze(0).shape#0之前插入
#out:torch.Size([1, 4, 1, 28, 28])

a.unsqueeze(-1).shape#-1之后插入
#out:torch.Size([4, 1, 28, 28, 1])

删减维度squeeze

b=torch.rand(1,32,1,1)#32个channel,每个Chanel上有一个点

b.squeeze().shape#挤压维度维1的
#out:torch.Size([32])

b.squeeze(0).shape#删减第一位
#out:torch.Size([32, 1, 1])

b.squeeze(-1).shape#删减倒数第一位
#out:torch.Size([1, 32, 1])

expand/repeat

expand()函数可以将张量广播到新的形状,但是切记以下两点:

  1. 只能对维度值为1的维度进行扩展,且扩展的Tensor不会分配新的内存,只是原来的基础上创建新的视图并返回;
  2. 无需扩展的维度请保持维度值不变。
a=torch.rand(1,32,14,14)
a.expand(4,32,14,14).shape#expand维度与之前一致,
#out:torch.Size([4, 32, 14, 14])

a.expand(4,32,-1,-1).shape#-1代表保持原来的维度不变
#out:torch.Size([4, 32, 14, 14])

repeat(),这个函数如函数名一样,是复制函数,参数表示把这个tensor复制成多少个,参数以1,2,3位来解释:

b=torch.rand(1,32,1,1)
a.repeat(4,1,1,1).shape#数字代表重复的字数
b.repeat(4,1,32,32).shape#重复4次,保持不变,重复32,。。32

转置操作

a=torch.randn(3,4)
a.t().shape

transpose维度交换

torch.transpose(Tensor, a,b):transpose只能操作2D矩阵的转置

a=torch.rand([4,3,32,32])

#transpose(1,3),代表交换的维度,1和3维度。
a1=a.transpose(1,3).view(4,3*32*32).view(4,3,32,32)
#[abcd]变成[adcb]在变成[abdc]
#注意数据不可用view随意变换

a2=a.transpose(1,3).contiguous().view(4,3*32*32).view(4,32,32,3).transpose(1,3)
#[abcd]-[adcb]-[abcd]

#比较a和a1,会发现
torch.all(torch.eq(a,a1))
#False

torch.all(torch.eq(a,a2))
#True

permute

Tensor.permute(a,b,c,d, …):permute函数可以对任意高维矩阵进行转置,但没有 torch.permute() 这个调用方式, 只能 Tensor.permute():

a=torch.rand(4,3,28,28)
a.transpose(1,3).shape

b=torch.rand(4,3,28,32)
b.transpose(1,3).shape

#所有维度可以随意变换
b.permute(0,2,3,1).shape
#torch.Size([4, 28, 32, 3])
### 删除或减少张量维度 #### PyTorch中的操作 在PyTorch中,可以通过`squeeze()`方法来删除单维度条目。该方法可以移除大小为1的维度,从而有效地减少张量的整体维度数[^3]。 ```python import torch # 创建一个形状为 (2, 1, 3) 的张量 tensor = torch.tensor([[[1., 2., 3.]], [[4., 5., 6.]]]) # 使用 squeeze 方法去除所有大小为1的维度 reduced_tensor = tensor.squeeze() print(reduced_tensor.shape) # 输出应为 torch.Size([2, 3]) ``` 如果只想去掉特定位置上等于1的尺寸,则可传递参数给`squeeze()`指定要处理的轴: ```python # 去掉第1维(索引从0开始计),即使它不是唯一的单一维度 specific_reduced_tensor = tensor.squeeze(1) print(specific_reduced_tensor.shape) # 输出应为 torch.Size([2, 3]) ``` 对于更复杂的降维需求,比如通过某种聚合方式(求和、平均等)降低某些维度,可以利用诸如`.sum()`, `.mean()`这样的内置函数[^4]。 #### TensorFlow中的操作 同样,在TensorFlow里也可以采用类似的策略来进行维度缩减。使用`tf.squeeze()`能够达到相同的效果——即消除那些长度为1的维度[^2]。 ```python import tensorflow as tf # 构建一个具有多余单位维度的常量张量 constant_tensor = tf.constant([[[1], [2], [3]], [[4], [5], [6]]]) # 应用 squeeze 函数以简化结构 simplified_tensor = tf.squeeze(constant_tensor) print(simplified_tensor.shape) # 结果应该是 (2, 3) ``` 当涉及到非平凡的维度调整时,可能还需要考虑其他类型的转换逻辑,例如重新排列现有轴的位置(`permute`)或是应用各种形式的数据聚集运算[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值