Pytorch中transpose后view和直接view操作张量输出不同是什么原因?
两种张量维度调整方法的核心差异
首先明确PyTorch两个API的底层逻辑区别:
view:仅按照张量在内存中的存储顺序重新调整形状,不会改变元素的先后存储顺序,仅改变维度的拆分方式transpose:会交换指定的两个维度的顺序,会调整元素的内存排布逻辑,对应维度上的元素顺序会被重排
你的场景下的具体差异
你原始的张量A形状为(B=5, N²=100, C=20),内存中元素的存储优先级为:batch维度 > 空间位置维度 > 通道维度,也就是先存第0个batch的第0个空间位置的全部20个通道值,再存第0个batch的第1个空间位置的全部20个通道值,依此类推。
第一种方法(逻辑正确,符合你的转换需求)
你先执行A.transpose(2,1),交换了最后两个维度,得到形状为(5, 20, 100)的张量,此时元素的存储逻辑变成:batch维度 > 通道维度 > 空间位置维度,也就是先存第0个batch第0个通道的全部100个空间位置值,再存第0个batch第1个通道的全部100个空间位置值。
后续执行view(5,20,10,10),就是把连续的100个空间位置值按顺序拆成10×10的网格,最终得到的(B,C,N,N)张量完全符合常规的特征图维度排布逻辑。
第二种方法(逻辑错误,不符合转换需求)
你直接执行A.view(5,20,10,10),没有做任何维度交换,直接按照原始的存储顺序硬拆形状。相当于把「第0个空间位置的20个通道值 + 第1个空间位置的前若干值」强行拼凑为第一个通道的前若干元素,空间位置和通道的对应关系完全混乱,你看到的细微差异本质是逻辑不匹配导致的错误结果,和你的目标需求完全不符。
如果需要验证差异,你可以用更小的固定值张量测试,比如把N=2、C=2,手动赋值后看两种方法的输出,就能很明显看到对应关系的区别。
内容的提问来源于stack exchange,提问作者Suho Cho
相关产品推荐
相关产品推荐

