import tensorflow as tf

    		conv = tf.nn.conv2d(bottom, filt, [1,stride,stride,1], padding='SAME')
    		bias = tf.nn.bias_add(conv, conv_biases)

    		tf.summary.histogram('weight', filt)
    		tf.summary.histogram('bias', conv_biases)

    		return bias

    def conv_bn_relu(self, bottom,name, kernel_size, output_channels, initializer,stride=1, bn=False,training=False,relu=True):
        input_channels = bottom.get_shape().as_list()[-1]
        with tf.variable_scope(name) as scope:
            kernel = self.variable('weights', [kernel_size, kernel_size, input_channels, output_channels], initializer, regularizer=tf.contrib.layers.l2_regularizer(0.0005))
            conv = tf.nn.conv2d(bottom, kernel, [1, stride, stride, 1], padding='SAME')
            biases = self.variable('biases', [output_channels], tf.constant_initializer(0.0))
            conv_layer = tf.nn.bias_add(conv, biases)
            if bn:
                conv_layer = self.batch_norm_layer('batch_norm_layer',conv_layer,training)
            if relu:
                conv_layer = tf.nn.relu(conv_layer, name=scope.name)
        print('Conv layer {0} -> {1}'.format(bottom.get_shape().as_list(),conv_layer.get_shape().as_list()))
        return conv_layer

    def batch_norm_layer(self, name, input_tensor,training):
        with tf.variable_scope(name) as scope:
            return tf.contrib.layers.batch_norm(input_tensor,scope=scope,is_training=training,decay=0.99)

    def deconv_bn_relu(self, bottom, name, kernel_size, output_channels, initializer, stride = 1, bn=False, training=False, relu=True):
        input_shape = bottom.get_shape().as_list()
