DCGAN介绍
1. DCGAN原理
生成对抗网络的核心思想是同时训练两个相互协作、相互竞争的深度神经网络,一个称为生成器(Generator),另一个称为判别器(Discriminator)。生成器用来生成假图片,而判别器用来判断图片的真假。
2. 转置卷积介绍
普通卷积的卷积操作是一种下采样(Subsampled)操作,就是让图像的大小从大变小,而转置卷积就是一种上采样(Upsampling)操作,让图像大小从小变大。
3. DCGAN模型结构
判别器
判断器的作用是判断一张图片是真还是假,属于二分类问题,所以模型的最后输出只需要1个神经元。
生成器
而生成器的作用是生成假图片,生成器的输入是一个100维的随机数,其实也可以不一定是100维,任意维度也是可以的。
总的来说,将原始数据看作真图片,生成器生成的图片看作假图片。将真图片和假图片都传给判别器进行学习,提升判别器的判断能力,同时利用判别器来提升生成器的造假能力。
实现代码
from tensorflow.keras.layers import (
Dense, BatchNormalization, LeakyReLU, Conv2DTranspose,
Reshape, Conv2D, Dropout, Flatten
)
import tensorflow as tf
from plot_model import plot_model
# 定义生成器
def generator_model():
noise_dim = 100
model = tf.keras.Sequential()
model.add(Dense(7*7*256, input_shape=(noise_dim,)))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Reshape((7,7,256)))
model.add(Conv2DTranspose(128, (5,5), strides=(1, 1), padding='same'))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Conv2DTranspose(64, (5,5), strides=(2, 2), padding='same'))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Conv2DTranspose(1, (5,5), strides=(2, 2), padding='same', activation='sigmoid'))
return model
# 定义判别器
def discriminiator_model():
model = tf.keras.Sequential()
model.add(Conv2D(64, (5,5), strides=(2, 2), padding='same', input_shape=[28,28,1]))
model.add(LeakyReLU())
model.add(Dropout(0.3))
model.add(Conv2D(128, (5,5), strides=(2,2), padding='same'))
model.add(LeakyReLU())
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
return model
if __name__ == '__main__':
discriminiator_model = discriminiator_model()
generator_model = generator_model()
plot_model(
discriminiator_model, to_file='./net_pic/discriminiator_model.png'
)
plot_model(
generator_model, to_file='./net_pic/generator_model.png'
)
print('plot_model-------------->')