矩阵乘法

计算两个输入张量之间的矩阵乘积,生成一个输出张量。在适用情况下,会使用广播机制(更多信息请参考形状信息)。

属性

op0: 如何处理第一个输入张量

  • NONE 默认行为。

  • TRANSPOSE 转置张量。仅转置最后两个维度。

  • VECTOR 将张量视为向量集合。

op1: 如何处理第二个输入张量,选项与 op0 相同。

输入

A: 类型为 T 的张量

B: 类型为 T 的张量

输出

C: 类型为 T 的张量

数据类型

T: float16, float32, bfloat16, float8

形状信息

A 是一个形状为 \([a_0,...,a_n], n \geq 2\) 的张量

B 是一个形状为 \([b_0,...,b_n], n \geq 2\) 的张量

C 是一个形状为 \([c_0,...,c_n], n \geq 2\) 的张量

对于每个输入维度(最后两个维度除外),长度必须匹配,或者其中一个必须等于 1。在后一种情况下,张量将沿该轴广播。

输出具有与输入相同的秩。对于每个输出维度(最后两个维度除外),如果它们匹配,则其长度等于相应输入维度的长度,否则等于不为 1 的长度。最后两个维度从简单的矩阵乘法规则推导出来。例如,当 op0op1 设置为 NONE 时,\(c_{n-1} = a_{n-1}, c_n = b_n\)

示例

矩阵乘法
input_shape = [1, 2, 2, 3]
input_shape2 = [1, 2, 3, 1]
in1 = network.add_input("input1", dtype=trt.float32, shape=input_shape)
in2 = network.add_input("input2", dtype=trt.float32, shape=input_shape2)
layer = network.add_matrix_multiply(in1, trt.MatrixOperation.NONE, in2, trt.MatrixOperation.NONE)
network.mark_output(layer.get_output(0))

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

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

outputs[layer.get_output(0).name] = layer.get_output(0).shape
expected[layer.get_output(0).name] = np.array(
    [
        [[-4.0], [-25.0]],
        [[-46.0], [5.0]],
    ]
)
使用广播的矩阵乘法
input_shape = [1, 2, 2, 3]
input_shape2 = [1, 1, 3, 1]
in1 = network.add_input("input1", dtype=trt.float32, shape=input_shape)
in2 = network.add_input("input2", dtype=trt.float32, shape=input_shape2)
layer = network.add_matrix_multiply(in1, trt.MatrixOperation.NONE, in2, trt.MatrixOperation.NONE)
network.mark_output(layer.get_output(0))

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

inputs[in2.name] = np.array([[[[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(
    [
        [
            [[-4.0], [-25.0]],
            [[-10.0], [2.0]],
        ]
    ]
)
矩阵乘法
input_shape = [1, 2, 3, 2]
input_shape2 = [1, 2, 3, 1]
in1 = network.add_input("input1", dtype=trt.float32, shape=input_shape)
in2 = network.add_input("input2", dtype=trt.float32, shape=input_shape2)
layer = network.add_matrix_multiply(in1, trt.MatrixOperation.TRANSPOSE, in2, trt.MatrixOperation.NONE)
network.mark_output(layer.get_output(0))

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

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

outputs[layer.get_output(0).name] = layer.get_output(0).shape
expected[layer.get_output(0).name] = np.array(
    [
        [[-4.0], [-25.0]],
        [[-46.0], [5.0]],
    ]
)

C++ API

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

Python API

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