def deconv2d_bilinear_upsampling_initializer(shape):
if shape[<NUM_LIT:0>] != shape[<NUM_LIT:1>]:<EOL><INDENT>raise Exception('<STR_LIT>')<EOL><DEDENT>if shape[<NUM_LIT:3>] < shape[<NUM_LIT:2>]:<EOL><INDENT>raise Exception(<EOL>'<STR_LIT>'<EOL>)<EOL><DEDENT>filter_size = shape[<NUM_LIT:0>]<EOL>num_out_channels = shape[<NUM_LIT:2>]<EOL>num_in_channels = shape[<NUM_LIT:3>]<EOL>bilinear_kernel = np.zeros([filter_size, filter_size], dtype=np.float32)<EOL>scale_factor = (filter_size + <NUM_LIT:1>) // <NUM_LIT:2><EOL>if filter_size % <NUM_LIT:2> == <NUM_LIT:1>:<EOL><INDENT>center = scale_factor - <NUM_LIT:1><EOL><DEDENT>else:<EOL><INDENT>center = scale_factor - <NUM_LIT:0.5><EOL><DEDENT>for x in range(filter_size):<EOL><INDENT>for y in range(filter_size):<EOL><INDENT>bilinear_kernel[x, y] = (<NUM_LIT:1> - abs(x - center) / scale_factor) * (<NUM_LIT:1> - abs(y - center) / scale_factor)<EOL><DEDENT><DEDENT>weights = np.zeros((filter_size, filter_size, num_out_channels, num_in_channels))<EOL>for i in range(num_out_channels):<EOL><INDENT>weights[:, :, i, i] = bilinear_kernel<EOL><DEDENT>return tf.constant_initializer(value=weights, dtype=LayersConfig.tf_dtype)<EOL>
Returns the initializer that can be passed to DeConv2dLayer for initializing the
    weights in correspondence to channel-wise bilinear up-sampling.
    Used in segmentation approaches such as [FCN](https://arxiv.org/abs/1605.06211)

    Parameters
    ----------
    shape : tuple of int
        The shape of the filters, [height, width, output_channels, in_channels].
        It must match the shape passed to DeConv2dLayer.

    Returns
    -------
    ``tf.constant_initializer``
        A constant initializer with weights set to correspond to per channel bilinear upsampling
        when passed as W_int in DeConv2dLayer

    Examples
    --------
    - Upsampling by a factor of 2, ie e.g 100->200
    >>> import tensorflow as tf
    >>> import tensorlayer as tl
    >>> rescale_factor = 2
    >>> imsize = 128
    >>> num_channels = 3
    >>> filter_shape = (5, 5)
    >>> filter_size = (2 * rescale_factor - rescale_factor % 2) #Corresponding bilinear filter size
    >>> num_in_channels = 3
    >>> num_out_channels = 3
    >>> deconv_filter_shape = (filter_size, filter_size, num_out_channels, num_in_channels)
    >>> x = tf.placeholder(tf.float32, (1, imsize, imsize, num_channels))
    >>> net = tl.layers.InputLayer(x, name='input_layer')
    >>> bilinear_init = deconv2d_bilinear_upsampling_initializer(shape=filter_shape)
    >>> net = tl.layers.DeConv2dLayer(net,
    ...                    shape=filter_shape,
    ...                    output_shape=(1, imsize*rescale_factor, imsize*rescale_factor, num_out_channels),
    ...                    strides=(1, rescale_factor, rescale_factor, 1),
    ...                    W_init=bilinear_init,
    ...                    padding='SAME',
    ...                    act=None, name='g/h1/decon2d')