import tensorflow as tf

    def atrous_discriminator(self, X, reuse):

        def atrous_convs(net, scope, rate=None, depth=256, reuse=None):
            """
            ASPP layer 1×1 convolution and three 3×3 atrous convolutions
            """
            with tf.variable_scope(scope, reuse=reuse):
                
                pyram_1x1_0 = self.conv('_1x1', net, depth, size=1, stride=1, padding="SAME")
                pyram_3x3_1 = self.conv('_3x3', net, depth, size=3, stride=1, padding="SAME")
                pyram_3x3_2 = self.conv('_atr_3x3_1', net, depth, size=3, stride=1, padding="SAME", dilation=rate[0])
                pyram_3x3_3 = self.conv('_atr_3x3_2', net, depth, size=3, stride=1, padding="SAME", dilation=rate[1])
                # pyram_3x3_4 = self.z_conv('_atr_3x3_3', net, depth/2, size=3, stride=1, padding="SAME", dilation=rate[2])
                
                net = tf.concat((pyram_1x1_0, pyram_3x3_1, pyram_3x3_2, pyram_3x3_3), axis=3, name="concat")

                net = self.conv('_1x1_output', net, depth, size=1, stride=1, padding="SAME")

                # pyram_1x1_0 = self.conv('_1x1', net, depth, size=1, stride=1, padding="SAME")
                # pyram_3x3_1 = self.conv('_3x3', net, depth/2, size=3, stride=1, padding="SAME")
                # pyram_3x3_2 = self.conv('_atr_3x3_1', net, depth/2, size=3, stride=1, padding="SAME", dilation=rate[0])
                # pyram_3x3_3 = self.conv('_atr_3x3_2', net, depth/2, size=3, stride=1, padding="SAME", dilation=rate[1])
                # # pyram_3x3_4 = self.conv('_atr_3x3_3', net, depth/2, size=3, stride=1, padding="SAME", dilation=rate[2])
                
                # net = tf.concat((pyram_1x1_0, pyram_3x3_1, pyram_3x3_2, pyram_3x3_3), axis=3, name="concat")

                # net = self.conv('_1x1_output', net, depth, size=1, stride=1, padding="SAME")

