code: def upsampling_feature_passthrough(early_feat, late_feat, filters, name, kernel_size=(1, 1)):
      
      _, h_early, w_early, c_early = early_feat.get_shape().as_list()
      _, h_late, w_late, c_late = late_feat.get_shape().as_list()
  
      s_x = int(w_early / w_late)
      s_y = int(h_early / h_late)
  
      assert h_late * s_y == h_early and w_late * s_x == w_early
  
      with tf.variable_scope(name) as scope:
          tiled = tile_2d(late_feat, s_x, s_y, "tile_2d", reorder_required=False)
          concated = tf.concat([early_feat, tiled], axis=-1)
          return tf.layers.conv2d(concated, filters=filters, kernel_size=kernel_size, strides=(1, 1), padding="same")
docs: An upsampling feature passthrough layer inspired by yolo9000 and the tiling layer.
  
      It can be proven, that this layer does the same as conv(concat(early_feat, tile_2d(late_feat))).
      This layer has no activation function.
  
      :param early_feat: The early feature layer of shape [batch_size, h * s_x, w * s_y, _].
      s_x and s_y are integers computed internally describing the scale between the layers.
      :param late_feat:  The late feature layer of shape [batch_size, h, w, _].
      :param filters: The number of convolution filters.
      :param name: The name of the layer.
      :param kernel_size: The size of the kernel. Default (1x1).
      :return: The output tensor of shape [batch_size, h * s_x, w * s_y, outputs]