(l-onnx-doc-DepthToSpace)= # DepthToSpace (l-onnx-op-depthtospace-28)= ## DepthToSpace - 28 ### Version - **name**: [DepthToSpace (GitHub)](https://github.com/onnx/onnx/blob/main/docs/Operators.md#DepthToSpace) - **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 DepthToSpace rearranges (permutes) data from depth into blocks of spatial data. This is the reverse transformation of SpaceToDepth. More specifically, this op outputs a copy of the input tensor where values from the depth dimension are moved in spatial blocks to the height and width dimensions. By default, `mode` = `DCR`. In the DCR mode, elements along the depth dimension from the input tensor are rearranged in the following order: depth, column, and then row. The output y is computed from the input x as below: ``` b, c, h, w = x.shape tmp = np.reshape(x, [b, blocksize, blocksize, c // (blocksize**2), h, w]) tmp = np.transpose(tmp, [0, 3, 4, 1, 5, 2]) y = np.reshape(tmp, [b, c // (blocksize**2), h * blocksize, w * blocksize]) ``` In the CRD mode, elements along the depth dimension from the input tensor are rearranged in the following order: column, row, and the depth. The output y is computed from the input x as below: ``` b, c, h, w = x.shape tmp = np.reshape(x, [b, c // (blocksize ** 2), blocksize, blocksize, h, w]) tmp = np.transpose(tmp, [0, 1, 4, 2, 5, 3]) y = np.reshape(tmp, [b, c // (blocksize ** 2), h * blocksize, w * blocksize]) ``` ### 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_mode_example ```python import numpy as np import onnx node = onnx.helper.make_node( "DepthToSpace", inputs=["x"], outputs=["y"], blocksize=2, mode="DCR" ) # (1, 8, 2, 3) input tensor x = 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) # (1, 2, 4, 6) output tensor y = 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) expect(node, inputs=[x], outputs=[y], name="test_depthtospace_example") ``` #### _crd_mode_example ```python import numpy as np import onnx node = onnx.helper.make_node( "DepthToSpace", inputs=["x"], outputs=["y"], blocksize=2, mode="CRD" ) # (1, 8, 2, 3) input tensor x = 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) # (1, 2, 4, 6) output tensor y = 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) expect(node, inputs=[x], outputs=[y], name="test_depthtospace_crd_mode_example") ``` ```{toctree} text_diff_DepthToSpace_13_28 ``` (l-onnx-op-depthtospace-13)= ## DepthToSpace - 13 ### Version - **name**: [DepthToSpace (GitHub)](https://github.com/onnx/onnx/blob/main/docs/Operators.md#DepthToSpace) - **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 DepthToSpace rearranges (permutes) data from depth into blocks of spatial data. This is the reverse transformation of SpaceToDepth. More specifically, this op outputs a copy of the input tensor where values from the depth dimension are moved in spatial blocks to the height and width dimensions. By default, `mode` = `DCR`. In the DCR mode, elements along the depth dimension from the input tensor are rearranged in the following order: depth, column, and then row. The output y is computed from the input x as below: ``` b, c, h, w = x.shape tmp = np.reshape(x, [b, blocksize, blocksize, c // (blocksize**2), h, w]) tmp = np.transpose(tmp, [0, 3, 4, 1, 5, 2]) y = np.reshape(tmp, [b, c // (blocksize**2), h * blocksize, w * blocksize]) ``` In the CRD mode, elements along the depth dimension from the input tensor are rearranged in the following order: column, row, and the depth. The output y is computed from the input x as below: ``` b, c, h, w = x.shape tmp = np.reshape(x, [b, c // (blocksize ** 2), blocksize, blocksize, h, w]) tmp = np.transpose(tmp, [0, 1, 4, 2, 5, 3]) y = np.reshape(tmp, [b, c // (blocksize ** 2), h * blocksize, w * blocksize]) ``` ### 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. ```{toctree} text_diff_DepthToSpace_11_28 text_diff_DepthToSpace_11_13 ``` (l-onnx-op-depthtospace-11)= ## DepthToSpace - 11 ### Version - **name**: [DepthToSpace (GitHub)](https://github.com/onnx/onnx/blob/main/docs/Operators.md#DepthToSpace) - **domain**: `main` - **since_version**: `11` - **function**: `False` - **support_level**: `SupportType.COMMON` - **shape inference**: `True` This version of the operator has been available **since version 11**. ### Summary DepthToSpace rearranges (permutes) data from depth into blocks of spatial data. This is the reverse transformation of SpaceToDepth. More specifically, this op outputs a copy of the input tensor where values from the depth dimension are moved in spatial blocks to the height and width dimensions. By default, `mode` = `DCR`. In the DCR mode, elements along the depth dimension from the input tensor are rearranged in the following order: depth, column, and then row. The output y is computed from the input x as below: b, c, h, w = x.shape tmp = np.reshape(x, [b, blocksize, blocksize, c // (blocksize**2), h, w]) tmp = np.transpose(tmp, [0, 3, 4, 1, 5, 2]) y = np.reshape(tmp, [b, c // (blocksize**2), h * blocksize, w * blocksize]) In the CRD mode, elements along the depth dimension from the input tensor are rearranged in the following order: column, row, and the depth. The output y is computed from the input x as below: b, c, h, w = x.shape tmp = np.reshape(x, [b, c // (blocksize ** 2), blocksize, blocksize, h, w]) tmp = np.transpose(tmp, [0, 1, 4, 2, 5, 3]) y = np.reshape(tmp, [b, c // (blocksize ** 2), h * blocksize, w * blocksize]) ### 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(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_DepthToSpace_1_28 text_diff_DepthToSpace_1_13 text_diff_DepthToSpace_1_11 ``` (l-onnx-op-depthtospace-1)= ## DepthToSpace - 1 ### Version - **name**: [DepthToSpace (GitHub)](https://github.com/onnx/onnx/blob/main/docs/Operators.md#DepthToSpace) - **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 DepthToSpace rearranges (permutes) data from depth into blocks of spatial data. This is the reverse transformation of SpaceToDepth. More specifically, this op outputs a copy of the input tensor where values from the depth dimension are moved in spatial blocks to the height and width dimensions. ### 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.