如何降低张量最后一个维度?将[2,1,80,64]张量转为[2,1,80,16]
要把形状为torch.Size([2, 1, 80, 64])的PyTorch Tensor转换为torch.Size([2, 1, 80, 16]),有以下几种可行的实现方式:
池化操作(平均/最大池化)
若需要在压缩维度的同时保留空间局部特征,池化是常用方案。由于最后一维从64到16是4倍缩放,可使用核大小为(1,4)、步幅为(1,4)的池化层:import torch import torch.nn as nn # 示例Tensor x = torch.randn(2, 1, 80, 64) # 平均池化 avg_pool = nn.AvgPool2d(kernel_size=(1, 4), stride=(1, 4)) output_avg = avg_pool(x) print(output_avg.shape) # torch.Size([2, 1, 80, 16]) # 最大池化 max_pool = nn.MaxPool2d(kernel_size=(1, 4), stride=(1, 4)) output_max = max_pool(x) print(output_max.shape) # torch.Size([2, 1, 80, 16])适用场景:CNN任务中需要保留空间特征的维度压缩。
手动维度聚合
可手动对最后一维分组做聚合计算,灵活度更高:# 分组取均值:将最后一维分成16组,每组4个元素取平均 output_mean = x.view(2, 1, 80, 16, 4).mean(dim=-1) print(output_mean.shape) # torch.Size([2, 1, 80, 16]) # 分组求和 output_sum = x.view(2, 1, 80, 16, 4).sum(dim=-1) print(output_sum.shape) # torch.Size([2, 1, 80, 16])适用场景:需要自定义聚合逻辑(如加权平均)的场景。
卷积层降维
使用1x4的卷积核,步幅设为4,输入输出通道保持一致,可学习更复杂的特征压缩方式:conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(1, 4), stride=(1, 4), bias=False) output_conv = conv(x) print(output_conv.shape) # torch.Size([2, 1, 80, 16])适用场景:需要通过训练学习最优压缩规则的深度学习任务。
直接切片
若对信息损失不敏感,可直接截取最后一维的部分元素:# 每隔4个元素取一个 output_slice = x[..., ::4] print(output_slice.shape) # torch.Size([2, 1, 80, 16]) # 取前16个元素 output_first16 = x[..., :16] print(output_first16.shape) # torch.Size([2, 1, 80, 16])适用场景:快速截取维度、对特征完整性要求低的场景。
线性层映射
通过线性层将最后一维从64映射到16,需先调整Tensor形状再恢复:linear = nn.Linear(64, 16) x_reshaped = x.squeeze(1) # 调整为(2, 80, 64) output_linear = linear(x_reshaped) output_linear = output_linear.unsqueeze(1) # 恢复为(2, 1, 80, 16) print(output_linear.shape) # torch.Size([2, 1, 80, 16])适用场景:需要学习全局维度映射关系的非空间特征转换。
内容的提问来源于stack exchange,提问作者Khoa D. Vo
相关产品推荐
相关产品推荐

