import tensorflow as tf

    def _conv(name, x, num_filters=16, kernel_size=(3, 3), padding='SAME', stride=(1, 1),
              initializer=tf.contrib.layers.xavier_initializer(), l2_strength=0.0, dilation=1.0, bias=-1):

        with tf.variable_scope(name):
            stride = [1, stride[0], stride[1], 1]
            kernel_shape = [kernel_size[0], kernel_size[1], x.shape[-1], num_filters]

            w = variable_with_weight_decay(kernel_shape, initializer, l2_strength)

            variable_summaries(w)
            if dilation > 1:
                conv = tf.nn.atrous_conv2d(x, w, dilation, padding)
            else:
                if type(padding)==type(''):
                    conv = tf.nn.conv2d(x, w, stride, padding)
                else:
                    conv = tf.pad(x, padding, "CONSTANT")
                    conv = tf.nn.conv2d(conv, w, stride, padding='VALID')

            if bias != -1:
                bias = tf.get_variable('biases', [num_filters], initializer=tf.constant_initializer(bias))

                variable_summaries(bias)
                conv = tf.nn.bias_add(conv, bias)

            tf.add_to_collection('debug_layers', conv)

            return conv
