DCGAN中的生成器和识别器代码详解

版权声明:版权归世界上所有无产阶级所有 https://blog.csdn.net/qq_41776781/article/details/86652803

 # DCGAN中的生成器 我自己写的有一个封装好的用于生成器和识别器的卷积操作 但是在这个代码中我没有使用我自己的代码 

# 原因想绍一下tensorflow自带的函数  所以找了一个以前在书上的代码 申明一下这个不是原创 但是原来代码中有几处不符合DCGAN的要求 所以就做了一些修改 转载链接没有 就直接写成原创

建议看代码之前先看看DCGAN的特点,然后再看代码中如何实这些特点的 这样会更有帮助

DCGAN(深度卷积的对抗生成网络)的特点

生成器之中:

1、在每一层操作之后,数据输出经过一个relu函数,然后使用batch_norm进行归一化处理

2、最后一层使用sigmoid函数作为激活函数,并且不使用batch_norm进行归一化操作

识别器之中:

1、除了最后一层,所有层都使用lrelu作为激活函数, 并且使用

2、最后一层使用tanh作为激活函数

3、最后一层不使用batch_norm

# 刚刚发现原来CSDN中可以直接插入代码 不错 以后就这样用了
def generator(z, reuse=None):
    size = 4
    with tf.variable_scope('generator', reuse=reuse):
        # 首先将图像进行全连接操作  然后使用relu作为激活函数 最后使用batch_norm作为全链接的输出
        g = tcl.fully_connected(z, size * size * 1024, activation_fn=tf.nn.relu, normalizer_fn=tcl.batch_norm)
        # 将上一层的图像reshape一下 
        g = tf.reshape(g, (-1, size, size, 1024))  # size
        
        # 接下来三层反置卷积操作 每层的激活函数都是relu 并且都是用batch_norm 图像返回的形状是 batch_size width high 3
        g = tcl.conv2d_transpose(g, 512, 3, stride=2,  # size*2
                                 activation_fn=tf.nn.relu, normalizer_fn=tcl.batch_norm, padding='SAME',
                                 weights_initializer=tf.random_normal_initializer(0, 0.02))
        g = tcl.conv2d_transpose(g, 256, 3, stride=2,  # size*4
                                 activation_fn=tf.nn.relu, normalizer_fn=tcl.batch_norm, padding='SAME',
                                 weights_initializer=tf.random_normal_initializer(0, 0.02))
        g = tcl.conv2d_transpose(g, 128, 3, stride=2,  # size*8
                                 activation_fn=tf.nn.relu, normalizer_fn=tcl.batch_norm, padding='SAME',
                                 weights_initializer=tf.random_normal_initializer(0, 0.02))

        g = tcl.conv2d_transpose(g, 3, 3, stride=2,  # size*16
                                 activation_fn=tf.nn.sigmoid, padding='SAME',
                                 weights_initializer=tf.random_normal_initializer(0, 0.02))
        # tensorflow中要想打印形状的话 最好直接使用值G 不要加上shape 因为有些不是numpy导致错误
        print("************生成器最后一层的返回的形状是:",g)
        return g
# 定义识别器
def discriminator(image, reuse=False):
    # 识别器中操作最为简单 上来四层卷积操作 每个卷积操作之后选择lrelu作为激活函数和batch_norm做归一化 很符合DCGAN论文上的讲解
    
    df_dim = 64
    with tf.variable_scope('discriminator', reuse=reuse):
        d= tcl.conv2d(image, num_outputs=df_dim, kernel_size=4, 
                            stride=2, activation_fn=lrelu, normalizer_fn=tcl.batch_norm)
        
        d= tcl.conv2d(d, num_outputs=df_dim * 2, kernel_size=4,  
                            stride=2, activation_fn=lrelu, normalizer_fn=tcl.batch_norm)
        d= tcl.conv2d(d, num_outputs=df_dim * 4, kernel_size=4, 
                            stride=2, activation_fn=lrelu, normalizer_fn=tcl.batch_norm)
        d= tcl.conv2d(d, num_outputs=df_dim * 8, kernel_size=4,
                            stride=2, activation_fn=lrelu, normalizer_fn=tcl.batch_norm)
       
        # flatten是将图像转化成一维的形式 因为后面的全连接fully_connected仅仅支持一维操作

        d= tcl.flatten(d)

        d = tcl.fully_connected(d, 1, activation_fn=tf.nn.tanh,
                                weights_initializer=tf.random_normal_initializer(0, 0.02))
        print("************识别器最后输出的形状是:", d)
        return d

猜你喜欢

转载自blog.csdn.net/qq_41776781/article/details/86652803