SpaceToDepth¶
Versioned name: SpaceToDepth-1
Category: Data movement
Short description: SpaceToDepth operation rearranges data from the spatial dimensions of the input tensor into depth dimension of the output tensor.
Detailed description
SpaceToDepth operation permutes element from the input tensor with shape [N, C, D1, D2, ..., DK]
, to the output tensor where values from the input spatial dimensions D1, D2, ..., DK
are moved to the new depth dimension.
The operation is equivalent to the following transformation of the input tensor data
with K
spatial dimensions of shape [N, C, D1, D2, ..., DK]
to Y output tensor. If mode = blocks_first
:
x' = reshape(data, [N, C, D1 / block_size, block_size, D2 / block_size, block_size, ... , DK / block_size, block_size])
x'' = transpose(x', [0, 3, 5, ..., K + (K + 1), 1, 2, 4, ..., K + K])
y = reshape(x'', [N, C * (block_size ^ K), D1 / block_size, D2 / block_size, ... , DK / block_size])
If mode = depth_first
:
x' = reshape(data, [N, C, D1 / block_size, block_size, D2 / block_size, block_size, ..., DK / block_size, block_size])
x'' = transpose(x', [0, 1, 3, 5, ..., K + (K + 1), 2, 4, ..., K + K])
y = reshape(x'', [N, C * (block_size ^ K), D1 / block_size, D2 / block_size, ..., DK / block_size])
Attributes
block_size
Description: specifies the size of the value block to be moved. The spatial dimensions must be evenly divided by
block_size
.Range of values: a positive integer
Type:
int
Default value: 1
Required: no
mode
Description: specifies how the output depth dimension is gathered from block coordinates and the old depth dimension.
Range of values:
blocks_first: the output depth is gathered from
[block_size, ..., block_size, C]
depth_first: the output depth is gathered from
[C, block_size, ..., block_size]
Type:
string
Required: yes
Inputs
1:
data
- input tensor of type T with rank >= 3. Required.
Outputs
1: permuted tensor of type T and shape
[N, C * (block_size ^ K), D1 / block_size, D2 / block_size, ..., DK / block_size]
.
Types
T: any supported type.
Example
<layer type="SpaceToDepth" ...>
<data block_size="2" mode="blocks_first"/>
<input>
<port id="0">
<dim>5</dim>
<dim>7</dim>
<dim>4</dim>
<dim>6</dim>
</port>
</input>
<output>
<port id="1">
<dim>5</dim> <!-- data.shape[0] -->
<dim>28</dim> <!-- data.shape[1] * (block_size ^ 2) -->
<dim>2</dim> <!-- data.shape[2] / block_size -->
<dim>3</dim> <!-- data.shape[3] / block_size -->
</port>
</output>
</layer>