为什么torch.add与torch.einsum运算返回的结果不一致?
原因说明
- 核心问题是对einsum的运算规则理解有误,你写的表达式
torch.einsum('xyzw,xyzw->xyzw',m,n)和m + n的运算逻辑完全不同:- einsum的默认计算逻辑是先逐元素相乘,再对未出现在输出索引中的维度求和。当前写的输入索引和输出索引完全一致,没有需要求和的维度,所以这行代码等价于
m * n(逐元素相乘),和逐元素相加的m + n结果自然存在差异。 - PyTorch的einsum本身是为乘积求和类运算设计的,没有直接实现逐元素相加的语法,如果需要做逐元素相加,直接使用
+运算符即可。
- einsum的默认计算逻辑是先逐元素相乘,再对未出现在输出索引中的维度求和。当前写的输入索引和输出索引完全一致,没有需要求和的维度,所以这行代码等价于
- 如果你的预期是实现其他运算逻辑,可以调整einsum的索引表达式:比如需要对w维度做乘积求和的话,可以将表达式调整为
'xyzw,xyzw->xyz',得到的结果等价于torch.sum(m * n, dim=-1)。
内容的提问来源于stack exchange,提问作者hhh
相关产品推荐
相关产品推荐

