这个东西虽然计算起来真的方便的很多,但是对于人的理解难度是真的加大的,特别是高纬度的时候,例如:t.einsum(‘ijk,jkl->ijl’, [a,b])三维计算的时候。因此,最好的方法就是举个例子并且换一种方式来实现相同的功能(即循环),然后debug最容易理解。这也是在学习过程中一个好的解决问题的方式。
import torch as t
# 假设输入张量 x_rep 的形状为 [batch_size, n_rules, input_size]
# 假设参数张量 self.Cons 的形状为 [n_rules, input_size, output_size]
batch_size = 2
n_rules = 3
input_size = 4
output_size = 2
# 生成示例输入张量 x_rep 和参数张量 self.Cons
x_rep = t.tensor([[[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]],
[[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]],
[[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]]
], dtype=t.float32)
self_Cons = t.tensor([[[0.1, 0.2],
[0.3, 0.4],
[0.5, 0.6],
[0.7, 0.8]],
[[1.1, 1.2],
[1.3, 1.4],
[1.5, 1.6],
[1.7, 1.8]],
[[2.1, 2.2],
[2.3, 2.4],
[2.5, 2.6],
[2.7, 2.8]]], dtype=t.float32)
# 使用循环进行张量运算
cons = t.zeros((batch_size, n_rules, output_size), dtype=t.float32)
for i in range(batch_size):
for j in range(n_rules):
for l in range(output_size):
for k in range(input_size):
cons[i, j, l] += x_rep[i, j, k] * self_Cons[j, k, l]
print("输出张量 cons:")
print(cons)
我知道你这时候其实已经很着急了(在看到我的文章的时候已经找了很多资料但是都没解释清楚让你理解),然后看到4层循环直接心态炸裂,根本就不可能在去debug。
因此,我直接告诉你第一个值,第二值怎么算出来的,你的心里会好受点:
第一个值5:1×0.1+2×0.3+3×0.5+4×0.7=5
第二个值6:1×0.2+2×0.4+3×0.6+4×0.8=6
第三个值37.4:5×1.1+6×1.3+7×1.5+8×1.7=37.4
希望对您有帮助,么么哒!!!