(l-onnx-doc-SpaceToDepth)= # SpaceToDepth (l-onnx-op-spacetodepth-28)= ## SpaceToDepth - 28 ### Version - **name**: [SpaceToDepth (GitHub)](https://github.com/onnx/onnx/blob/main/docs/Operators.md#SpaceToDepth) - **domain**: `main` - **since_version**: `28` - **function**: `True` - **support_level**: `SupportType.COMMON` - **shape inference**: `True` This version of the operator has been available **since version 28**. ### Summary SpaceToDepth rearranges blocks of spatial data into depth. More specifically, this op outputs a copy of the input tensor where values from the height and width dimensions are moved to the depth dimension. `mode` determines whether blocks are ordered depth-column-row (`DCR`, the default) or column-row-depth (`CRD`). ### Attributes * **blocksize - INT** (required) : Blocks of [blocksize, blocksize] are moved. * **mode - STRING** (default is `DCR`): DCR (default) for depth-column-row order re-arrangement. Use CRD for column-row-depth order. ### Inputs - **input** (heterogeneous) - **T**: Input tensor of [N,C,H,W], where N is the batch axis, C is the channel or depth, H is the height and W is the width. ### Outputs - **output** (heterogeneous) - **T**: Output tensor of [N, C * blocksize * blocksize, H/blocksize, W/blocksize]. ### Type Constraints * **T** in ( `tensor(bfloat16)`, `tensor(bool)`, `tensor(complex128)`, `tensor(complex64)`, `tensor(double)`, `tensor(float)`, `tensor(float16)`, `tensor(int16)`, `tensor(int32)`, `tensor(int64)`, `tensor(int8)`, `tensor(string)`, `tensor(uint16)`, `tensor(uint32)`, `tensor(uint64)`, `tensor(uint8)` ): Constrain input and output types to all tensor types. ### Examples #### default ```python import numpy as np import onnx b, c, h, w = shape = (2, 2, 6, 6) blocksize = 2 node = onnx.helper.make_node( "SpaceToDepth", inputs=["x"], outputs=["y"], blocksize=blocksize, ) x = np.random.random_sample(shape).astype(np.float32) tmp = np.reshape( x, [b, c, h // blocksize, blocksize, w // blocksize, blocksize] ) tmp = np.transpose(tmp, [0, 3, 5, 1, 2, 4]) y = np.reshape(tmp, [b, c * (blocksize**2), h // blocksize, w // blocksize]) expect(node, inputs=[x], outputs=[y], name="test_spacetodepth") ``` #### _example ```python import numpy as np import onnx node = onnx.helper.make_node( "SpaceToDepth", inputs=["x"], outputs=["y"], blocksize=2, ) # (1, 1, 4, 6) input tensor x = np.array( [ [ [ [0, 6, 1, 7, 2, 8], [12, 18, 13, 19, 14, 20], [3, 9, 4, 10, 5, 11], [15, 21, 16, 22, 17, 23], ] ] ] ).astype(np.float32) # (1, 4, 2, 3) output tensor y = np.array( [ [ [[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]], [[12, 13, 14], [15, 16, 17]], [[18, 19, 20], [21, 22, 23]], ] ] ).astype(np.float32) expect(node, inputs=[x], outputs=[y], name="test_spacetodepth_example") ``` #### _dcr_mode_example ```python import numpy as np import onnx node = onnx.helper.make_node( "SpaceToDepth", inputs=["x"], outputs=["y"], blocksize=2, mode="DCR", ) # (1, 2, 4, 6) input tensor x = np.array( [ [ [ [0.0, 18.0, 1.0, 19.0, 2.0, 20.0], [36.0, 54.0, 37.0, 55.0, 38.0, 56.0], [3.0, 21.0, 4.0, 22.0, 5.0, 23.0], [39.0, 57.0, 40.0, 58.0, 41.0, 59.0], ], [ [9.0, 27.0, 10.0, 28.0, 11.0, 29.0], [45.0, 63.0, 46.0, 64.0, 47.0, 65.0], [12.0, 30.0, 13.0, 31.0, 14.0, 32.0], [48.0, 66.0, 49.0, 67.0, 50.0, 68.0], ], ] ] ).astype(np.float32) # (1, 8, 2, 3) output tensor y = np.array( [ [ [[0.0, 1.0, 2.0], [3.0, 4.0, 5.0]], [[9.0, 10.0, 11.0], [12.0, 13.0, 14.0]], [[18.0, 19.0, 20.0], [21.0, 22.0, 23.0]], [[27.0, 28.0, 29.0], [30.0, 31.0, 32.0]], [[36.0, 37.0, 38.0], [39.0, 40.0, 41.0]], [[45.0, 46.0, 47.0], [48.0, 49.0, 50.0]], [[54.0, 55.0, 56.0], [57.0, 58.0, 59.0]], [[63.0, 64.0, 65.0], [66.0, 67.0, 68.0]], ] ] ).astype(np.float32) expect(node, inputs=[x], outputs=[y], name="test_spacetodepth_dcr_mode_example") ``` #### _crd_mode_example ```python import numpy as np import onnx node = onnx.helper.make_node( "SpaceToDepth", inputs=["x"], outputs=["y"], blocksize=2, mode="CRD", ) # (1, 2, 4, 6) input tensor x = np.array( [ [ [ [0.0, 9.0, 1.0, 10.0, 2.0, 11.0], [18.0, 27.0, 19.0, 28.0, 20.0, 29.0], [3.0, 12.0, 4.0, 13.0, 5.0, 14.0], [21.0, 30.0, 22.0, 31.0, 23.0, 32.0], ], [ [36.0, 45.0, 37.0, 46.0, 38.0, 47.0], [54.0, 63.0, 55.0, 64.0, 56.0, 65.0], [39.0, 48.0, 40.0, 49.0, 41.0, 50.0], [57.0, 66.0, 58.0, 67.0, 59.0, 68.0], ], ] ] ).astype(np.float32) # (1, 8, 2, 3) output tensor y = np.array( [ [ [[0.0, 1.0, 2.0], [3.0, 4.0, 5.0]], [[9.0, 10.0, 11.0], [12.0, 13.0, 14.0]], [[18.0, 19.0, 20.0], [21.0, 22.0, 23.0]], [[27.0, 28.0, 29.0], [30.0, 31.0, 32.0]], [[36.0, 37.0, 38.0], [39.0, 40.0, 41.0]], [[45.0, 46.0, 47.0], [48.0, 49.0, 50.0]], [[54.0, 55.0, 56.0], [57.0, 58.0, 59.0]], [[63.0, 64.0, 65.0], [66.0, 67.0, 68.0]], ] ] ).astype(np.float32) expect(node, inputs=[x], outputs=[y], name="test_spacetodepth_crd_mode_example") ``` ```{toctree} text_diff_SpaceToDepth_13_28 ``` (l-onnx-op-spacetodepth-13)= ## SpaceToDepth - 13 ### Version - **name**: [SpaceToDepth (GitHub)](https://github.com/onnx/onnx/blob/main/docs/Operators.md#SpaceToDepth) - **domain**: `main` - **since_version**: `13` - **function**: `False` - **support_level**: `SupportType.COMMON` - **shape inference**: `True` This version of the operator has been available **since version 13**. ### Summary SpaceToDepth rearranges blocks of spatial data into depth. More specifically, this op outputs a copy of the input tensor where values from the height and width dimensions are moved to the depth dimension. ### Attributes * **blocksize - INT** (required) : Blocks of [blocksize, blocksize] are moved. ### Inputs - **input** (heterogeneous) - **T**: Input tensor of [N,C,H,W], where N is the batch axis, C is the channel or depth, H is the height and W is the width. ### Outputs - **output** (heterogeneous) - **T**: Output tensor of [N, C * blocksize * blocksize, H/blocksize, W/blocksize]. ### Type Constraints * **T** in ( `tensor(bfloat16)`, `tensor(bool)`, `tensor(complex128)`, `tensor(complex64)`, `tensor(double)`, `tensor(float)`, `tensor(float16)`, `tensor(int16)`, `tensor(int32)`, `tensor(int64)`, `tensor(int8)`, `tensor(string)`, `tensor(uint16)`, `tensor(uint32)`, `tensor(uint64)`, `tensor(uint8)` ): Constrain input and output types to all tensor types. ```{toctree} text_diff_SpaceToDepth_1_28 text_diff_SpaceToDepth_1_13 ``` (l-onnx-op-spacetodepth-1)= ## SpaceToDepth - 1 ### Version - **name**: [SpaceToDepth (GitHub)](https://github.com/onnx/onnx/blob/main/docs/Operators.md#SpaceToDepth) - **domain**: `main` - **since_version**: `1` - **function**: `False` - **support_level**: `SupportType.COMMON` - **shape inference**: `True` This version of the operator has been available **since version 1**. ### Summary SpaceToDepth rearranges blocks of spatial data into depth. More specifically, this op outputs a copy of the input tensor where values from the height and width dimensions are moved to the depth dimension. ### Attributes * **blocksize - INT** (required) : Blocks of [blocksize, blocksize] are moved. ### Inputs - **input** (heterogeneous) - **T**: Input tensor of [N,C,H,W], where N is the batch axis, C is the channel or depth, H is the height and W is the width. ### Outputs - **output** (heterogeneous) - **T**: Output tensor of [N, C * blocksize * blocksize, H/blocksize, W/blocksize]. ### Type Constraints * **T** in ( `tensor(bool)`, `tensor(complex128)`, `tensor(complex64)`, `tensor(double)`, `tensor(float)`, `tensor(float16)`, `tensor(int16)`, `tensor(int32)`, `tensor(int64)`, `tensor(int8)`, `tensor(string)`, `tensor(uint16)`, `tensor(uint32)`, `tensor(uint64)`, `tensor(uint8)` ): Constrain input and output types to all tensor types.