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.