Einsum

根据 equation 参数指定的维度,计算输入元素沿维度的总和,该参数以爱因斯坦求和约定编写。

  • equation 为输入中的每个维度指定 ASCII 小写字母,字母顺序与维度顺序相同,每个输入之间用逗号分隔。

  • equation 表示为 term1,term2…->output-term,其中每个 term 对应一个操作数张量,term 内的字符对应操作数维度。

  • 用相同下标标记的维度必须匹配。

  • 在多个输入中重复一个标签意味着这些轴将被相乘。

  • 从输出中省略一个标签意味着将累加沿这些轴的值。

  • 输出下标必须至少出现一次在某个输入操作数中,并且最多出现一次在输出中。

  • 在隐式模式下,即如果 equation 不包含 ->,则表达式中出现一次的索引将按字母顺序递增成为输出的一部分。

  • 在显式模式下,可以通过添加箭头 (->) 后跟输出的下标标签来控制输出。例如,ij,jk->ik 等同于 ij,jk。

  • 空字符串 (“”) 对于标量操作数有效。

  • equation 可能在不同元素(下标、箭头和逗号)之间包含空格 (SPC- 0x20)。

属性

equation 一个字符串,表示以爱因斯坦求和约定编写的求和方程。

输入

inputs: 类型为 T 的张量。最多可以设置两个输入。

输出

output: 类型为 T 的张量。

数据类型

T: float16, float32, bfloat16

形状信息

示例

Einsum
in1 = network.add_input("input1", dtype=trt.float32, shape=(2, 3))
layer = network.add_einsum(inputs=[in1], equation="ij->ji")
network.mark_output(layer.get_output(0))

inputs[in1.name] = np.array([[-3.0, -2.0, -1.0], [0.0, 1.0, 2.0]])

outputs[layer.get_output(0).name] = layer.get_output(0).shape

expected[layer.get_output(0).name] = np.array(
    [
        [-3.0, 0.0],
        [-2.0, 1.0],
        [-1.0, 2.0],
    ]
)
in1 = network.add_input("input1", dtype=trt.float32, shape=(2, 3))
in2 = network.add_input("input2", dtype=trt.float32, shape=(3, 1))
layer = network.add_einsum(inputs=[in1, in2], equation="ik,kj->ij")
network.mark_output(layer.get_output(0))

inputs[in1.name] = np.array([[-3.0, -2.0, -1.0], [0.0, 1.0, 2.0]])

inputs[in2.name] = np.array([[1.0], [2.0], [3.0]])

outputs[layer.get_output(0).name] = layer.get_output(0).shape

expected[layer.get_output(0).name] = np.array([[-10.0], [8.0]])

C++ API

有关 C++ IEinsumLayer 算子的更多信息,请参阅 C++ IEinsumLayer 文档

Python API

有关 Python IEinsumLayer 算子的更多信息,请参阅 Python IEinsumLayer 文档