版权声明:版权归世界上所有无产阶级所有 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