Scale#

Computes a per-element affine transformation: \(output = (\text{input} \cdot \text{scale} + \text{shift})^{\text{power}}\) on an input tensor into an output tensor.

Attributes#

mode Scale coefficients can be applied across: - UNIFORM Identical coefficients for all elements. - CHANNEL Identical coefficients for all elements in the same channel. - ELEMENTWISE Identical coefficients for all elements with the same channel and spatial coordinates.

scale the scale coefficient to use. If empty, defaults to 1.

shift the shift coefficient to use. If empty, defaults to 0.

power the power coefficient to use. If empty, defaults to 1.

channel_axis the channel axis to use. In cases where CHANNEL transformation is used, for input \([a_0,..,a_{\text{channel_axis}},..,a_n]\) the coefficients are addressed at \([a_{\text{channel_axis}}]\). In cases where ELEMENTWISE transformation is used, for input \([a_0,..,a_{\text{channel_axis}},..,a_n]\) the coefficients are addressed at \([a_{\text{channel_axis}},..,a_n]\).

Inputs#

input: tensor of type T.

Outputs#

output: tensor of type T.

Data Types#

T: int8, float16, float32, bfloat16

Shape Information#

input and output are tensors with a shape of \([a_0,...,a_n], n \geq 4\)

DLA Support#

DLA FP16 and DLA INT8 are supported. Custom values for the power coefficient are not supported.

Examples#

Scale 4D
in1 = network.add_input("input1", dtype=trt.float32, shape=(1, 1, 3, 3))
scale_u = np.array([2], np.float32).reshape(-1)
shift_u = np.array([1], np.float32).reshape(-1)
power_u = np.array([2], np.float32).reshape(-1)
layer = network.add_scale(in1, trt.ScaleMode.UNIFORM, shift=shift_u, scale=scale_u, power=power_u)
network.mark_output(layer.get_output(0))

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

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

expected[layer.get_output(0).name] = np.array([[[[9.0, 25.0, 49.0], [81.0, 121.0, 169.0], [225.0, 289.0, 361.0]]]])
Scale 5D
in1 = network.add_input("input1", dtype=trt.float32, shape=(1, 2, 1, 3, 3))
scale_u = np.array([1, 2], np.float32).reshape(-1)
shift_u = np.array([0, 1], np.float32).reshape(-1)
power_u = np.array([1, 2], np.float32).reshape(-1)
layer = network.add_scale_nd(
    in1, trt.ScaleMode.CHANNEL, shift=shift_u, scale=scale_u, power=power_u, channel_axis=1
)
network.mark_output(layer.get_output(0))

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

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

expected[layer.get_output(0).name] = np.array(
    [
        [
            [
                [
                    [1.0, 2.0, 3.0],
                    [4.0, 5.0, 6.0],
                    [7.0, 8.0, 9.0],
                ]
            ],
            [[[9.0, 25.0, 49.0], [81.0, 121.0, 169.0], [225.0, 289.0, 361.0]]],
        ]
    ]
)

C++ API#

For more information about the C++ IScaleLayer operator, refer to the C++ IScaleLayer documentation.

Python API#

For more information about the Python IScaleLayer operator, refer to the Python IScaleLayer documentation.