'Apply the self._conv op.
Arguments:
x: input tensor. It needs to be a 4D tensor of the form
[batch, height, width, channels].
Returns:
The output of the convolution of x with the current convolutional
kernel.
Raises:
ValueError: if number of channels is not defined at graph construction.'

def _Apply(self, x):

    input_shape = x.get_shape().with_rank(4)
    input_shape[3:].assert_is_fully_defined()
    if (self._kernel is None):
        assert (self._kernel_shape[2] == 0), self._kernel_shape
        self._kernel_shape[2] = input_shape[3].value
        if (self._kernel_shape[3] < 0):
            self._kernel_shape[3] = self._kernel_shape[2]
        self._kernel = self._CreateKernel(self._kernel_shape, x.dtype)
    (x, padding) = HandleConvPaddingModes(x, self._padding, self._kernel_shape, self._strides)
    if (self._atrous_rate is None):
        x = self._conv(x, self._kernel, strides=self._strides, padding=padding)
    else:
        x = self._conv(x, self._kernel, rate=self._atrous_rate, padding=padding)
    if (self._padding != 'VALID'):
        height = ((1 + ((input_shape[1].value - 1) // self._strides[1])) if input_shape[1].value else None)
        width = ((1 + ((input_shape[2].value - 1) // self._strides[2])) if input_shape[2].value else None)
        shape = x.get_shape()
        x.set_shape([shape[0], height, width, shape[3]])
    return self._act(self._bias(x))
