Slice¶
Extracts elements from an input tensor into an output tensor.
Attributes¶
start
First coordinate to use.
size
Output dimensions.
stride
Stride between coordinates.
slice_mode
Describes how out-of-bounds coordinates are handled.
Let \(y\) denote the components of an output coordinate and \(d\) denote dimensions of the input tensor. Define \(x_i=y_i \cdot \text{stride}_i + \text{start}_i\).
STRICT_BOUNDS
\(output[y_i]=input[x_i]\) if \(0 \leq x_i < d_i\). Otherwise issue error.WRAP
\(output[y_i]=input[mod(x_i, d_i)]\)CLAMP
\(output[y_i]=input[z_i] \text{ where } z_i=\begin{cases}0, \text{if } x_i<0 \\ d_i-1, \text{if } x_i \geq d_i \\ x_i, \text{otherwise}\end{cases}\)FILL
\(output[y_i]=\begin{cases}input[x_i], \text{if } 0\leq x_i < d_i \\ \text{fill value}, \text{otherwise}\end{cases}\)REFLECT
\(output[y_i]=input[z_i] \text{ where } z_i=\begin{cases}2 \cdot d_i-2-c_i, \text{if } c_i \geq d_i \\ c_i, \text{otherwise } \end{cases} \text{ where } c_i=mod(|x_i|, 2 \cdot d_i -2)\)
Alternatively, the start
, size
, and stride
can be specified by
inputs to the slice operation.
Inputs¶
input0: tensor of type T
.
input1: optional tensor of type Int32
or Int64` with ``start
.
input2: optional tensor of type Int32
or Int64` with ``size
.
input3: optional tensor of type Int32
or Int64` with ``stride
.
input4: optional tensor of type T
(or type immplicitly convertible to T
)
containing fill value for FILL
mode.
Outputs¶
output: tensor of type T
.
Data Types¶
T: bool
, int8
, int32
, int64
, float16
, float32
, bfloat16
Note:
CLAMP
,FILL
andREFLECT
modes do not supportint64
orbfloat16
.
Shape Information¶
input0 has shape \([d_0,...,d_{n-1}]\).
input1 has shape \([n]\).
input2 has shape \([n]\).
input3 has shape \([n]\).
input4 has shape \([]\).
output is a tensor with shape \([\text{size}_0,...,\text{size}_{n-1}]\).
DLA Support¶
DLA FP16 is supported.
Examples¶
Slice
in1 = network.add_input("input1", dtype=trt.float32, shape=(3, 3))
layer = network.add_slice(in1, start=(0, 0), shape=(2, 2), stride=(1, 1))
network.mark_output(layer.get_output(0))
inputs[in1.name] = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
outputs[layer.get_output(0).name] = layer.get_output(0).shape
expected[layer.get_output(0).name] = np.array([[0, 1], [3, 4]])
Slice Fill
in1 = network.add_input("input1", dtype=trt.float32, shape=(2, 2))
layer = network.add_slice(in1, start=(0, 0), shape=(3, 3), stride=(1, 1))
fill_constant = network.add_input("fill_constant", dtype=trt.float32, shape=())
layer.mode = trt.SampleMode.FILL
layer.set_input(4, fill_constant)
network.mark_output(layer.get_output(0))
inputs[in1.name] = np.zeros(shape=(2, 2))
inputs[fill_constant.name] = np.array([1.0])
outputs[layer.get_output(0).name] = layer.get_output(0).shape
expected[layer.get_output(0).name] = np.array([[0, 0, 1], [0, 0, 1], [1, 1, 1]])
C++ API¶
For more information about the C++ ISliceLayer operator, refer to the C++ ISliceLayer documentation.
Python API¶
For more information about the Python ISliceLayer operator, refer to the Python ISliceLayer documentation.