code: def FixedUnPooling(
      x, shape, unpool_mat=None, data_format="channels_last"
  ):
      """
      Unpool the input with a fixed matrix to perform kronecker product with.
  
      Args:
          x (tf.Tensor): a 4D image tensor
          shape: int or (h, w) tuple
          unpool_mat: a tf.Tensor or np.ndarray 2D matrix with size=shape.
              If is None, will use a matrix with 1 at top-left corner.
  
      Returns:
          tf.Tensor: a 4D image tensor.
      """
      data_format = get_data_format(data_format, keras_mode=False)
      shape = shape2d(shape)
  
      output_shape = StaticDynamicShape(x)
      output_shape.apply(
          1 if data_format == "NHWC" else 2, lambda x: x * shape[0]
      )
      output_shape.apply(
          2 if data_format == "NHWC" else 3, lambda x: x * shape[1]
      )
  
      # a faster implementation for this special case
      if (
          shape[0] == 2
          and shape[1] == 2
          and unpool_mat is None
          and data_format == "NHWC"
      ):
          ret = UnPooling2x2ZeroFilled(x)
      else:
          # check unpool_mat
          if unpool_mat is None:
              mat = np.zeros(shape, dtype="float32")
              mat[0][0] = 1
              unpool_mat = tf.constant(mat, name="unpool_mat")
          elif isinstance(unpool_mat, np.ndarray):
              unpool_mat = tf.constant(unpool_mat, name="unpool_mat")
          assert unpool_mat.shape.as_list() == list(shape)
  
          if data_format == "NHWC":
              x = tf.transpose(x, [0, 3, 1, 2])
          # perform a tensor-matrix kronecker product
          x = tf.expand_dims(x, -1)  # bchwx1
          mat = tf.expand_dims(unpool_mat, 0)  # 1xshxsw
          ret = tf.tensordot(x, mat, axes=1)  # bxcxhxwxshxsw
  
          if data_format == "NHWC":
              ret = tf.transpose(ret, [0, 2, 4, 3, 5, 1])
          else:
              ret = tf.transpose(ret, [0, 1, 2, 4, 3, 5])
  
          shape3_dyn = [
              output_shape.get_dynamic(k) for k in range(1, 4)
          ]
          ret = tf.reshape(ret, tf.stack([-1] + shape3_dyn))
  
      ret.set_shape(tf.TensorShape(output_shape.get_static()))
      return ret
  
file_path: tensorpack/tensorpack/models/pool.py
imports: import numpy
  from ..compat import tfv1
  from ..utils.argtools import get_data_format, shape2d
  from .common import layer_register
  from .shape_utils import StaticDynamicShape
  from .tflayer import convert_to_tflayer_args
label_desc: Use image node_id 5 for calling a global function with example usage: FixedUnPooling(x, shape, unpool_mat, data_format) and returns: ret