矩阵乘法¶
计算两个输入张量之间的矩阵乘积,生成一个输出张量。在适用情况下,会使用广播机制(更多信息请参考形状信息)。
属性¶
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 的长度。最后两个维度从简单的矩阵乘法规则推导出来。例如,当 op0
和 op1
设置为 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 文档。