:nosearch: .. _op_ai_onnx_Unsqueeze-13: Unsqueeze - version 13 ====================== This page documents version **13** of operator **Unsqueeze**. See :doc:`Unsqueeze` for the latest version (since version 25). - **Domain**: ``ai.onnx`` - **Since version**: 13 Insert single-dimensional entries to the shape of an input tensor (``data``). Takes one required input ``axes`` - which contains a list of dimension indices and this operator will insert a dimension of value ``1`` into the corresponding index of the output tensor (``expanded``). For example: .. code-block:: text Given an input tensor (`data`) of shape [3, 4, 5], then Unsqueeze(data, axes=[0, 4]) outputs a tensor (`expanded`) containing the same data as `data` but with shape [1, 3, 4, 5, 1]. The ``axes`` should not contain any duplicate entries. It is an error if it contains duplicates. The rank of the output tensor (``output_rank``) is the rank of the input tensor (``data``) plus the number of values in ``axes``. Each value in ``axes`` should be within the (inclusive) range [-output_rank , output_rank - 1]. The order of values in ``axes`` does not matter and can come in any order. **Inputs** - **data** (*T*): Original tensor - **axes** (*tensor(int64)*): List of integers indicating the dimensions to be inserted. Negative value means counting dimensions from the back. Accepted range is [-r, r-1] where r = rank(expanded). **Outputs** - **expanded** (*T*): Reshaped tensor with same data as input. **Type Constraints** - **T**: Constrain input and output types to all tensor types. Allowed types: 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). Examples -------- **test_cc_unsqueeze_axes** .. code-block:: text Node: Unsqueeze(data, axes) -> (expanded) .. code-block:: text Inputs: data: shape=(2, 3), dtype=float32 [[0., 1., 2.], [3., 4., 5.]] axes: shape=(2,), dtype=int64 [0, 2] Outputs: expanded: shape=(1, 2, 1, 3), dtype=float32 [[[[0., 1., 2.]], [[3., 4., 5.]]]] **test_unsqueeze_axis_0** .. code-block:: text Node: Unsqueeze(x, axes) -> (y) .. code-block:: text Inputs: x: shape=(3, 4, 5), dtype=float32 [[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.]], [[20., 21., 22., 23., 24.], [25., 26., 27., 28., 29.], [30., 31., 32., 33., 34.], [35., 36., 37., 38., 39.]], [[40., 41., 42., 43., 44.], [45., 46., 47., 48., 49.], [50., 51., 52., 53., 54.], [55., 56., 57., 58., 59.]]] axes: shape=(1,), dtype=int64 [0] Outputs: y: shape=(1, 3, 4, 5), dtype=float32 [[[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.]], [[20., 21., 22., 23., 24.], [25., 26., 27., 28., 29.], [30., 31., 32., 33., 34.], [35., 36., 37., 38., 39.]], [[40., 41., 42., 43., 44.], [45., 46., 47., 48., 49.], [50., 51., 52., 53., 54.], [55., 56., 57., 58., 59.]]]] **test_unsqueeze_axis_1** .. code-block:: text Node: Unsqueeze(x, axes) -> (y) .. code-block:: text Inputs: x: shape=(3, 4, 5), dtype=float32 [[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.]], [[20., 21., 22., 23., 24.], [25., 26., 27., 28., 29.], [30., 31., 32., 33., 34.], [35., 36., 37., 38., 39.]], [[40., 41., 42., 43., 44.], [45., 46., 47., 48., 49.], [50., 51., 52., 53., 54.], [55., 56., 57., 58., 59.]]] axes: shape=(1,), dtype=int64 [1] Outputs: y: shape=(3, 1, 4, 5), dtype=float32 [[[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.]]], [[[20., 21., 22., 23., 24.], [25., 26., 27., 28., 29.], [30., 31., 32., 33., 34.], [35., 36., 37., 38., 39.]]], [[[40., 41., 42., 43., 44.], [45., 46., 47., 48., 49.], [50., 51., 52., 53., 54.], [55., 56., 57., 58., 59.]]]] **test_unsqueeze_axis_2** .. code-block:: text Node: Unsqueeze(x, axes) -> (y) .. code-block:: text Inputs: x: shape=(3, 4, 5), dtype=float32 [[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.]], [[20., 21., 22., 23., 24.], [25., 26., 27., 28., 29.], [30., 31., 32., 33., 34.], [35., 36., 37., 38., 39.]], [[40., 41., 42., 43., 44.], [45., 46., 47., 48., 49.], [50., 51., 52., 53., 54.], [55., 56., 57., 58., 59.]]] axes: shape=(1,), dtype=int64 [2] Outputs: y: shape=(3, 4, 1, 5), dtype=float32 [[[[ 0., 1., 2., 3., 4.]], [[ 5., 6., 7., 8., 9.]], [[10., 11., 12., 13., 14.]], [[15., 16., 17., 18., 19.]]], [[[20., 21., 22., 23., 24.]], [[25., 26., 27., 28., 29.]], [[30., 31., 32., 33., 34.]], [[35., 36., 37., 38., 39.]]], [[[40., 41., 42., 43., 44.]], [[45., 46., 47., 48., 49.]], [[50., 51., 52., 53., 54.]], [[55., 56., 57., 58., 59.]]]] **test_unsqueeze_negative_axes** .. code-block:: text Node: Unsqueeze(x, axes) -> (y) .. code-block:: text Inputs: x: shape=(1, 3, 1, 5), dtype=float32 [[[[ 0., 1., 2., 3., 4.]], [[ 5., 6., 7., 8., 9.]], [[10., 11., 12., 13., 14.]]]] axes: shape=(1,), dtype=int64 [-2] Outputs: y: shape=(1, 3, 1, 1, 5), dtype=float32 [[[[[ 0., 1., 2., 3., 4.]]], [[[ 5., 6., 7., 8., 9.]]], [[[10., 11., 12., 13., 14.]]]]] **test_unsqueeze_three_axes** .. code-block:: text Node: Unsqueeze(x, axes) -> (y) .. code-block:: text Inputs: x: shape=(3, 4, 5), dtype=float32 [[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.]], [[20., 21., 22., 23., 24.], [25., 26., 27., 28., 29.], [30., 31., 32., 33., 34.], [35., 36., 37., 38., 39.]], [[40., 41., 42., 43., 44.], [45., 46., 47., 48., 49.], [50., 51., 52., 53., 54.], [55., 56., 57., 58., 59.]]] axes: shape=(3,), dtype=int64 [2, 4, 5] Outputs: y: shape=(3, 4, 1, 5, 1, 1), dtype=float32 [[[[[[ 0.]], [[ 1.]], [[ 2.]], [[ 3.]], [[ 4.]]]], [[[[ 5.]], [[ 6.]], [[ 7.]], [[ 8.]], [[ 9.]]]], [[[[10.]], [[11.]], [[12.]], [[13.]], [[14.]]]], [[[[15.]], [[16.]], [[17.]], [[18.]], [[19.]]]]], [[[[[20.]], [[21.]], [[22.]], [[23.]], [[24.]]]], [[[[25.]], [[26.]], [[27.]], [[28.]], [[29.]]]], [[[[30.]], [[31.]], [[32.]], [[33.]], [[34.]]]], [[[[35.]], [[36.]], [[37.]], [[38.]], [[39.]]]]], [[[[[40.]], [[41.]], [[42.]], [[43.]], [[44.]]]], [[[[45.]], [[46.]], [[47.]], [[48.]], [[49.]]]], [[[[50.]], [[51.]], [[52.]], [[53.]], [[54.]]]], [[[[55.]], [[56.]], [[57.]], [[58.]], [[59.]]]]]] **test_unsqueeze_two_axes** .. code-block:: text Node: Unsqueeze(x, axes) -> (y) .. code-block:: text Inputs: x: shape=(3, 4, 5), dtype=float32 [[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.]], [[20., 21., 22., 23., 24.], [25., 26., 27., 28., 29.], [30., 31., 32., 33., 34.], [35., 36., 37., 38., 39.]], [[40., 41., 42., 43., 44.], [45., 46., 47., 48., 49.], [50., 51., 52., 53., 54.], [55., 56., 57., 58., 59.]]] axes: shape=(2,), dtype=int64 [1, 4] Outputs: y: shape=(3, 1, 4, 5, 1), dtype=float32 [[[[[ 0.], [ 1.], [ 2.], [ 3.], [ 4.]], [[ 5.], [ 6.], [ 7.], [ 8.], [ 9.]], [[10.], [11.], [12.], [13.], [14.]], [[15.], [16.], [17.], [18.], [19.]]]], [[[[20.], [21.], [22.], [23.], [24.]], [[25.], [26.], [27.], [28.], [29.]], [[30.], [31.], [32.], [33.], [34.]], [[35.], [36.], [37.], [38.], [39.]]]], [[[[40.], [41.], [42.], [43.], [44.]], [[45.], [46.], [47.], [48.], [49.]], [[50.], [51.], [52.], [53.], [54.]], [[55.], [56.], [57.], [58.], [59.]]]]] **test_unsqueeze_unsorted_axes** .. code-block:: text Node: Unsqueeze(x, axes) -> (y) .. code-block:: text Inputs: x: shape=(3, 4, 5), dtype=float32 [[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.]], [[20., 21., 22., 23., 24.], [25., 26., 27., 28., 29.], [30., 31., 32., 33., 34.], [35., 36., 37., 38., 39.]], [[40., 41., 42., 43., 44.], [45., 46., 47., 48., 49.], [50., 51., 52., 53., 54.], [55., 56., 57., 58., 59.]]] axes: shape=(3,), dtype=int64 [5, 4, 2] Outputs: y: shape=(3, 4, 1, 5, 1, 1), dtype=float32 [[[[[[ 0.]], [[ 1.]], [[ 2.]], [[ 3.]], [[ 4.]]]], [[[[ 5.]], [[ 6.]], [[ 7.]], [[ 8.]], [[ 9.]]]], [[[[10.]], [[11.]], [[12.]], [[13.]], [[14.]]]], [[[[15.]], [[16.]], [[17.]], [[18.]], [[19.]]]]], [[[[[20.]], [[21.]], [[22.]], [[23.]], [[24.]]]], [[[[25.]], [[26.]], [[27.]], [[28.]], [[29.]]]], [[[[30.]], [[31.]], [[32.]], [[33.]], [[34.]]]], [[[[35.]], [[36.]], [[37.]], [[38.]], [[39.]]]]], [[[[[40.]], [[41.]], [[42.]], [[43.]], [[44.]]]], [[[[45.]], [[46.]], [[47.]], [[48.]], [[49.]]]], [[[[50.]], [[51.]], [[52.]], [[53.]], [[54.]]]], [[[[55.]], [[56.]], [[57.]], [[58.]], [[59.]]]]]] Differences with previous version (11) -------------------------------------- **SchemaDiff**: ``Unsqueeze`` (domain ``'ai.onnx'``) * old version: 11 * new version: 13 * breaking: **yes** **Breaking reasons:** * input 'axes' (added): at position 1; option=Single; type_str='tensor(int64)' * attribute 'axes' (removed): type=INTS; required=True **Inputs:** * [BREAKING] added 'axes': at position 1; option=Single; type_str='tensor(int64)' **Attributes:** * [BREAKING] removed 'axes': type=INTS; required=True **Type constraints:** * changed 'T': added types: ['tensor(bfloat16)'] **Documentation:** * line similarity: 0.85 (+2/-2 lines) .. code-block:: diff --- Unsqueeze v11 +++ Unsqueeze v13 @@ -1,12 +1,12 @@ Insert single-dimensional entries to the shape of an input tensor (`data`). -Takes one required argument `axes` - which contains a list of dimension indices and this operator will insert a dimension of value `1` into the corresponding index of the output tensor (`expanded`). +Takes one required input `axes` - which contains a list of dimension indices and this operator will insert a dimension of value `1` into the corresponding index of the output tensor (`expanded`). For example: Given an input tensor (`data`) of shape [3, 4, 5], then Unsqueeze(data, axes=[0, 4]) outputs a tensor (`expanded`) containing the same data as `data` but with shape [1, 3, 4, 5, 1]. -The attribute `axes` should not contain any duplicate entries. It is an error if it contains duplicates. +The `axes` should not contain any duplicate entries. It is an error if it contains duplicates. The rank of the output tensor (`output_rank`) is the rank of the input tensor (`data`) plus the number of values in `axes`. Each value in `axes` should be within the (inclusive) range [-output_rank , output_rank - 1]. The order of values in `axes` does not matter and can come in any order.