DepthToSpace

Versioned name: DepthToSpace-1

Category: Data movement

Short description: DepthToSpace operation rearranges data from the depth dimension of the input tensor into spatial dimensions of the output tensor.

Detailed description

DepthToSpace operation permutes elements from the input tensor with shape [N, C, D1, D2, ..., DK], to the output tensor where values from the input depth dimension (features) C are moved to spatial blocks in D1, …, DK.

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, block_size, block_size, ..., block_size, C / (block_size ^ K), D1, D2, ..., DK])
x'' = transpose(x', [0,  K + 1,  K + 2, 1, K + 3, 2, K + 4, 3, ..., K + (K + 1), K])
y = reshape(x'', [N, C / (block_size ^ K), D1 * block_size, D2 * block_size, D3 * block_size, ..., DK * block_size])

If mode = depth_first:

x' = reshape(data, [N, C / (block_size ^ K), block_size, block_size, ..., block_size, D1, D2, ..., DK])
x'' = transpose(x', [0,  1,  K + 2, 2, K + 3, 3, K + 4, 4, ..., K + (K + 1), K + 1])
y = reshape(x'', [N, C / (block_size ^ K), D1 * block_size, D2 * block_size, D3 * block_size, ..., DK * block_size])

Attributes

  • block_size

    • Description: specifies the size of the value block to be moved. The depth dimension size must be evenly divided by block_size ^ (len(input.shape) - 2).

    • Range of values: a positive integer

    • Type: int

    • Default value: 1

    • Required: no

  • mode

    • Description: specifies how the input depth dimension is split to block coordinates and the new depth dimension.

    • Range of values:

      • blocks_first: the input depth is divided to [block_size, ..., block_size,  new_depth]

      • depth_first: the input depth is divided to [new_depth, 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="DepthToSpace" ...>
    <data block_size="2" mode="blocks_first"/>
    <input>
        <port id="0">
            <dim>5</dim>
            <dim>28</dim>
            <dim>2</dim>
            <dim>3</dim>
        </port>
    </input>
    <output>
        <port id="1">
            <dim>5</dim>  <!-- data.shape[0] -->
            <dim>7</dim>  <!-- data.shape[1] / (block_size ^ 2) -->
            <dim>4</dim>  <!-- data.shape[2] * block_size -->
            <dim>6</dim>  <!-- data.shape[3] * block_size -->
        </port>
    </output>
</layer>