code: def conv_2d(filters, kernel_shape, strides, padding, input_shape=None):
    
    if input_shape is not None:
      return Conv2D(filters=filters, kernel_size=kernel_shape,
                    strides=strides, padding=padding,
                    input_shape=input_shape)
    else:
      return Conv2D(filters=filters, kernel_size=kernel_shape,
                    strides=strides, padding=padding)
docs: Defines the right convolutional layer according to the
    version of Keras that is installed.
    :param filters: (required integer) the dimensionality of the output
                    space (i.e. the number output of filters in the
                    convolution)
    :param kernel_shape: (required tuple or list of 2 integers) specifies
                         the kernel shape of the convolution
    :param strides: (required tuple or list of 2 integers) specifies
                         the strides of the convolution along the width and
                         height.
    :param padding: (required string) can be either 'valid' (no padding around
                    input or feature map) or 'same' (pad to ensure that the
                    output feature map size is identical to the layer input)
    :param input_shape: (optional) give input shape if this is the first
                        layer of the model
    :return: the Keras layer