Col2Im#
Versioned name: Col2Im-15
Category: Data movement
Short description: Col2Im operation constructs an image based on input
tensor containing sliding data blocks (blocks of the image) and desired output_size
.
Detailed description
Consider an input
tensor containing batches of image blocks of shape (N, C * Product(kernel_size), L)
, where:
N
is the batch dimension,C * Product(kernel_size)
is the number of elements within a block (each block containsProduct(kernel_size)
vectors containing values from each channelC
),L
is the total number of blocks calculated as follows:
L = product from d=1 to 2 of floor((output_size[d] + pads_begin[d] + pads_end[d] - dilation[d] * (kernel_size[d] - 1) - 1) / stride[d] + 1)
where d
is over all spatial dimensions.
The input
blocks are being moved into the output
tensor of shape (N, C, output_size[0], output_size[1])
by combining the values contained in blocks.
Non-batched inputs are also supported, in which case the input
has shape (C * Product(kernel_size), L)
and the output has shape (C, output_size[0], output_size[1])
.
Attributes:
strides
Description: stride in the sliding blocks in the input spatial dimensions.
Range of values: 1D tensor of positive integer numbers
Type: T_IDX
Default value: [1, 1]
Required: no
dilations
Description: controls local stride of the elements.
Range of values: 1D tensor of non-negative integer numbers
Type: T_IDX
Default value: [1, 1]
Required: no
pads_begin
Description: pads_begin is a number of zero-value pixels to add to the beginning along each axis. For example, pads_begin equal “1,2” means adding 1 pixel to the top of the input and 2 to the left of the input.
Range of values: 1D tensor of non-negative integer numbers
Type: T_IDX
Default value: [0, 0]
Required: no
pads_end
Description: pads_end is a number of zero-value pixels to add to the ending along each axis. For example, pads_end equal “1,2” means adding 1 pixel to the bottom of the input and 2 to the right of the input.
Range of values: 1D tensor of non-negative integer numbers
Type: T_IDX
Default value: [0, 0]
Required: no
Inputs
1: data
Description: A batched 3D tensor of type T and shape
(N, C * Product(kernel_size), L)
or an unbatched 2D tensor of type T and shape(C * Product(kernel_size), L)
. Required.Range of values: 1D tensor of non-negative integer numbers
Type: T
2: output_size
Description: controls the shape of the spatial dimensions of the output image. Required.
Range of values: 1D tensor of two positive integer numbers (height and width)
Type: T_IDX
3: kernel_size
Description: size of the sliding blocks. Required.
Range of values: 1D tensor of non-negative integer numbers
Type: T_IDX
Outputs
1: The output tensor the output image of type T and shape:
(N, C, output_size[0], output_size[1])
in case of batched input,(C, output_size[0], output_size[1])
in case of non-batched input.
Types
T: any supported data type.
T_IDX:
int64
orint32
.
Examples
All examples assume C = 3
.
Example 1: default optional Parameters
For inputs output_size
= [16, 16] and kernel_size
= [2, 2]
<layer ... type="Col2Im" ... >
<input>
<port id="0" precision="I32">
<dim>3</dim> <!-- batch_axis -->
<dim>12</dim> <!-- C * Product(kernel_size) -->
<dim>225</dim> <!-- L -->
</port>
<port id="1" precision="I32">
<dim>2</dim> <!-- output_size -->
</port>
<port id="2" precision="I32">
<dim>2</dim> <!-- kernel_size -->
</port>
</input>
<output>
<port id="1" precision="I32">
<dim>3</dim> <!-- batch_axis -->
<dim>3</dim> <!-- C -->
<dim>16</dim> <!-- output_size[0] -->
<dim>16</dim> <!-- output_size[1] -->
</port>
</output>
</layer>
Example 2: non-default dilations, padding and strides
For inputs output_size
= [16, 16] and kernel_size
= [3, 3]
<layer ... type="Col2Im" ... >
<data dilations="2,2" pads_begin="1,1" pads_end="1,1" strides="2,2"/>
<input>
<port id="0" precision="I32">
<dim>1</dim> <!-- batch_axis -->
<dim>27/dim> <!-- C * Product(kernel_size) -->
<dim>25</dim> <!-- L -->
</port>
<port id="1" precision="I32">
<dim>2</dim> <!-- output_size -->
</port>
<port id="2" precision="I32">
<dim>2</dim> <!-- kernel_size -->
</port>
</input>
<output>
<port id="1" precision="I32">
<dim>1</dim> <!-- batch_axis -->
<dim>3</dim> <!-- C -->
<dim>16</dim> <!-- output_size[0] -->
<dim>16</dim> <!-- output_size[1] -->
</port>
</output>
</layer>
Example 3: non-default dilations and padding
For inputs output_size
= [32, 32] and kernel_size
= [2, 2]
<layer ... type="Col2Im" ... >
<data dilations="2,2" pads_begin="3,3" pads_end="3,3"/>
<input>
<port id="0" precision="I32">
<dim>12</dim> <!-- batch_axis -->
<dim>12/dim> <!-- C * Product(kernel_size) -->
<dim>324</dim> <!-- L -->
</port>
<port id="1" precision="I32">
<dim>2</dim> <!-- output_size -->
</port>
<port id="2" precision="I32">
<dim>2</dim> <!-- kernel_size -->
</port>
</input>
<output>
<port id="1" precision="I32">
<dim>12</dim> <!-- batch_axis -->
<dim>3</dim> <!-- C -->
<dim>32</dim> <!-- output_size[0] -->
<dim>32</dim> <!-- output_size[1] -->
</port>
</output>
</layer>
Example 4: default optional Parameters, unbatched
For inputs output_size
= [16, 16] and kernel_size
= [2, 2]
<layer ... type="Col2Im" ... >
<input>
<port id="0" precision="I32">
<dim>12</dim> <!-- C * Product(kernel_size) -->
<dim>225</dim> <!-- L -->
</port>
<port id="1" precision="I32">
<dim>2</dim> <!-- output_size -->
</port>
<port id="2" precision="I32">
<dim>2</dim> <!-- kernel_size -->
</port>
</input>
<output>
<port id="1" precision="I32">
<dim>3</dim> <!-- C -->
<dim>16</dim> <!-- output_size[0] -->
<dim>16</dim> <!-- output_size[1] -->
</port>
</output>
</layer>