如何对维度部分匹配的两个张量执行逐元素相乘?
张量逐元素相乘的简洁写法
你提到的场景里,原代码的第三个None其实是多余的——张量A是1维的[16],只需要扩展两个维度到[16,1,1],就能和形状为[16,1,30,30]的B通过广播机制完成逐元素相乘。这里有几种更简洁的写法:
直接用索引扩展维度:
result = A[:, None, None] * B这里
[:, None, None]直接把A从[16]扩展为[16,1,1],和B的维度匹配,广播规则会自动将其扩展到[16,1,30,30]完成相乘。使用
unsqueeze方法(可读性更强):result = A.unsqueeze(-1).unsqueeze(-1) * Bunsqueeze(-1)表示在最后一个维度后添加新维度,两次调用后A的形状变为[16,1,1],效果和上面完全一致。如果是PyTorch等框架,也可以用
expand显式扩展(不过不如前两种简洁):result = A.expand(-1, 1, 30, 30) * B-1表示保持原维度大小,后面的数值指定扩展后的维度,适合需要明确指定形状的场景。
本质上这些写法都是利用张量的广播机制,核心是让A的形状和B的形状在对应维度上满足广播条件(要么维度大小相同,要么其中一个为1)。
内容的提问来源于stack exchange,提问作者giladrv
相关产品推荐
相关产品推荐

