如何对(512,20,32)张量在行维度执行AvgPool得到(512,10,32)
解决AvgPool1d对指定维度池化的问题
你的问题核心是nn.AvgPool1d默认对输入的最后一维执行池化操作,而你需要池化的是中间的20维度(对应目标形状的10)。
解决方案:调整维度顺序
先将需要池化的维度转移到最后一维,执行池化后再还原维度顺序即可:
import torch import torch.nn as nn # 定义池化层 pool = nn.AvgPool1d(kernel_size=2, stride=2) # 生成测试数据 data = torch.rand(512, 20, 32) # 调整维度:把要池化的20维度放到最后(AvgPool1d默认处理最后一维) data_permuted = data.permute(0, 2, 1) # 形状变为 (512, 32, 20) # 执行池化,此时池化作用在最后一维20,得到10 out = pool(data_permuted) # 形状变为 (512, 32, 10) # 还原维度顺序 out = out.permute(0, 2, 1) # 最终形状 (512, 10, 32) print(out.shape) # 输出 torch.Size([512, 10, 32])
原代码失败原因
PyTorch的nn.AvgPool1d要求输入格式为(批量大小N, 通道数C, 序列长度L),你的输入(512,20,32)被解析为:
N=512:批量大小C=20:通道数L=32:要池化的序列维度
因此池化操作被应用在了最后一维32上,导致输出形状变为(512,20,16),而非预期的结果。
内容的提问来源于stack exchange,提问作者user3668129
相关产品推荐
相关产品推荐

