'Transform input from data space to model space.
Perform the Xception "Entry flow", which consists of two convolutional
filter upscalings followed by three residually connected separable
convolution blocks.
Args:
inputs: A Tensor with shape [batch, ...]
Returns:
body_input: A Tensor with shape [batch, ?, ?, body_input_depth].'

def bottom(self, inputs):

    with tf.variable_scope(self.name):
        def xnet_resblock(x, filters, res_relu, name):
            with tf.variable_scope(name):
                y = common_layers.separable_conv_block(x, filters, [((1, 1), (3, 3)), ((1, 1), (3, 3))], first_relu=True, padding='SAME', force2d=True, name='sep_conv_block')
                y = common_layers.pool(y, (3, 3), 'MAX', 'SAME', strides=(2, 2))
                return (y + common_layers.conv_block(x, filters, [((1, 1), (1, 1))], padding='SAME', strides=(2, 2), first_relu=res_relu, force2d=True, name='res_conv0'))
        inputs = common_layers.standardize_images(inputs)
        x = common_layers.conv_block(inputs, 32, [((1, 1), (3, 3))], first_relu=False, padding='SAME', strides=(2, 2), force2d=True, name='conv0')
        x = common_layers.conv_block(x, 64, [((1, 1), (3, 3))], padding='SAME', force2d=True, name='conv1')
        x = xnet_resblock(x, min(128, self._body_input_depth), True, 'block0')
        x = xnet_resblock(x, min(256, self._body_input_depth), False, 'block1')
        return xnet_resblock(x, self._body_input_depth, False, 'block2')
