Reduce

跨输入张量的维度计算规约,得到输出张量。

属性

operation Reduce 操作可以是以下之一

  • SUM 对元素求和。

  • PROD 对元素求积。

  • MAX 检索最大元素。

  • MIN 检索最小元素。

  • AVG 计算元素的平均值。

axes 要规约的轴,表示为位掩码。例如,当 \(axes=6\) 时,维度 1 和 2 被规约。

keep_dims 控制是否通过保留规约后的维度(维度为 1)来保持原始秩,或者降低张量的秩。

输入

input: 类型为 T 的张量。

输出

output: 类型为 T 的张量。

数据类型

T: int8, int32, int64, float16, float32, bfloat16

形状信息

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

keep_dims 设置为 True 时,output 是一个形状为 \([b_0,...,b_n]\) 的张量,其中: \(b_i = \begin{cases}a_i, & axes[i] = 0 \\1, & axes[i] = 1 \\\end{cases}\)

keep_dims 设置为 False 时,output 是一个形状为 \([b_0,...,b_m]\) 的张量,并且它的形状等效于 keep_dims = true 的情况,只是移除了规约后的单位维度。

DLA 支持

DLA 支持以下 operation 类型

  • MAX,其中 CHW 的任意组合被规约。

请注意,DLA 的批大小是除 CHW 维度之外的所有维度的乘积。

示例

Reduce
in1 = network.add_input("input1", dtype=trt.float32, shape=(1, 2, 2, 3))
layer = network.add_reduce(in1, op=trt.ReduceOperation.MAX, axes=4, keep_dims=True)
network.mark_output(layer.get_output(0))

inputs[in1.name] = np.array(
    [
        [
            [[-3.0, -2.0, -1.0], [0.0, 1.0, 2.0]],
            [[3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
        ]
    ]
)

outputs[layer.get_output(0).name] = layer.get_output(0).shape
expected[layer.get_output(0).name] = np.array(
    [
        [
            [[0.0, 1.0, 2.0]],
            [[6.0, 7.0, 8.0]],
        ]
    ]
)
Reduce,keep_dims 设置为 false
in1 = network.add_input("input1", dtype=trt.float32, shape=(1, 2, 2, 3))
layer = network.add_reduce(in1, op=trt.ReduceOperation.PROD, axes=6, keep_dims=False)
network.mark_output(layer.get_output(0))

inputs[in1.name] = np.array(
    [
        [
            [[-3.0, -2.0, -1.0], [0.0, 1.0, 2.0]],
            [[3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
        ]
    ]
)

outputs[layer.get_output(0).name] = layer.get_output(0).shape
expected[layer.get_output(0).name] = np.array([[0.0, -56.0, -80.0]])

C++ API

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

Python API

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