class_docstr: Insert a single-dimension in a 1D or higher tensor at each axis in axes.
  
  Parameters
  ----------
  x: tensor<*?, T> (Required)
      * Scalar or tensor.
  axes: const tensor<[K], i32> Required
      * ``K`` is the number of dimensions expanded.
      * Insert single dimension at dimension index at each axes.
      * Negative value to index from the end. ``-d-1 <= axis <= d``
        where ``d`` is the rank of ``x``.
  
  Returns
  -------
  tensor<*(rank(x)+K), T>
      * Same type as the input ``x`` with rank ``rank(x)+K``.
  
  Attributes
  ----------
  T: fp32
code: def value_inference(self):
      axes = self.axes.val
      out_rank = self.x.rank + len(axes)
  
      for axis in axes:
          if axis <= -out_rank - 1 or axis >= out_rank:
              msg = 'Axis value {} is out of bounds for {} node "{}" of shape {}'
              raise IndexError(
                  msg.format(
                      axis, self.op_type, self.name, self.x.shape
                  )
              )
  
      axes = sorted(
          [out_rank + axis if axis < 0 else axis for axis in axes]
      )
      ret_shape = list(self.x.shape)
      for axis in axes:
          ret_shape.insert(axis, 1)
      return np.reshape(self.x.val, ret_shape)
  
imports: import functools
  import sympy
  from coremltools.converters.mil.mil.types.symbolic import is_symbolic, isscalar, any_symbolic, any_variadic
  from coremltools.converters.mil.mil import get_new_symbol, get_new_variadic_symbol, VALUE, SYMBOL, types
  from ._op_reqs import *
label_desc: Use image node_id 3 for calling the expand_dims obj's underlying member method code with example usage: obj.value_inference() and returns: np