import tensorflow as tf

                                initializer=tf.truncated_normal_initializer(stddev=stddev))
            self.g = tf.get_variable('g',[out_dim],
                                     initializer=tf.constant_initializer(float('nan')))
            self.b = tf.get_variable('b',[out_dim],
                                     initializer=tf.constant_initializer(float('nan')))

            self.strides = [1, d_h, d_w, 1]

            self.epsilon = epsilon

    def __call__(self,input_var,name=None,**kwargs) :
        shapes = tf.shape(input_var)
        shapes = tf.stack([shapes[0],shapes[1]*self.strides[1],shapes[2]*self.strides[2],tf.shape(self.b)[0]])

        def _init():
            v_norm = tf.nn.l2_normalize(self.v,axis=[0,1,3])
            t = tf.nn.conv2d_transpose(input_var,v_norm,
                                       output_shape=shapes,
                                       strides=self.strides,
                                       padding='SAME',
                                       data_format='NHWC')
            mu,var = tf.nn.moments(t,axes=[0,1,2])
            std = tf.sqrt(var+self.epsilon)
            return [tf.assign(self.g,1/std),tf.assign(self.b,-1.*mu/std)]
