以下是一个简单的 Keras DCGAN 代码示例:
```python
from keras.datasets import mnist
from keras.models import Sequential, Model
from keras.layers import Input, Dense, Reshape, Flatten, Dropout
from keras.layers import Conv2D, Conv2DTranspose, LeakyReLU
from keras.optimizers import Adam
import numpy as np
# 设置输入形状
img_rows = 28
img_cols = 28
channels = 1
img_shape = (img_rows, img_cols, channels)
z_dim = 100
# 构建生成器模型
def build_generator(z_dim):
model = Sequential()
# 全连接层
model.add(Dense(128 * 7 * 7, input_dim=z_dim))
model.add(LeakyReLU(alpha=0.01))
model.add(Reshape((7, 7, 128)))
# 转置卷积层
model.add(Conv2DTranspose(64, kernel_size=3, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.01))
# 转置卷积层
model.add(Conv2DTranspose(1, kernel_size=3, strides=2, padding='same', activation='tanh'))
return model
# 构建鉴别器模型
def build_discriminator(img_shape):
model = Sequential()
# 卷积层
model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=img_shape, padding='same'))
model.add(LeakyReLU(alpha=0.01))
# 卷积层
model.add(Conv2D(64, kernel_size=3, strides=2, input_shape=img_shape, padding='same'))
model.add(LeakyReLU(alpha=0.01))
# 卷积层
model.add(Conv2D(128, kernel_size=3, strides=2, input_shape=img_shape, padding='same'))
model.add(LeakyReLU(alpha=0.01))
# 扁平层
model.add(Flatten())
model.add(Dropout(0.4))
# 输出层
model.add(Dense(1, activation='sigmoid'))
return model
# 构建深度卷积生成对抗网络模型
def build_gan(generator, discriminator):
model = Sequential()
# 生成器 + 鉴别器
model.add(generator)
model.add(discriminator)
return model
# 构建鉴别器模型
discriminator = build_discriminator(img_shape)
# 编译鉴别器模型
discriminator.compile(loss='binary_crossentropy',
optimizer=Adam(),
metrics=['accuracy'])
# 构建生成器模型
generator = build_generator(z_dim)
# 保持鉴别器不可训练
discriminator.trainable = False
# 构建深度卷积生成对抗网络模型
gan = build_gan(generator, discriminator)
# 编译深度卷积生成对抗网络模型
gan.compile(loss='binary_crossentropy', optimizer=Adam())
# 加载 MNIST 数据集
(X_train, _), (_, _) = mnist.load_data()
# 标准化输入数据
X_train = X_train / 127.5 - 1.
X_train = np.expand_dims(X_train, axis=3)
# 定义训练参数
batch_size = 64
epochs = 30000
sample_interval = 200
# 构建噪声向量
z = np.random.normal(0, 1, (batch_size, z_dim))
# 训练深度卷积生成对抗网络
for epoch in range(epochs):
# ---------------------
# 训练鉴别器
# ---------------------
# 随机选择一个批次的真实图像
idx = np.random.randint(0, X_train.shape[0], batch_size)
real_imgs = X_train[idx]
# 生成假图像
noise = np.random.normal(0, 1, (batch_size, z_dim))
fake_imgs = generator.predict(noise)
# 训练鉴别器
d_loss_real = discriminator.train_on_batch(real_imgs, np.ones((batch_size, 1)))
d_loss_fake = discriminator.train_on_batch(fake_imgs, np.zeros((batch_size, 1)))
d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
# ---------------------
# 训练生成器
# ---------------------
# 生成噪声向量
noise = np.random.normal(0, 1, (batch_size, z_dim))
# 训练生成器
g_loss = gan.train_on_batch(noise, np.ones((batch_size, 1)))
# 打印损失和准确率指标
print("%d [D loss: %f, acc.: %.2f%%] [G loss: %f]" % (epoch, d_loss[0], 100 * d_loss[1], g_loss))
# 保存生成的图片
if epoch % sample_interval == 0:
# 生成噪声向量
noise = np.random.normal(0, 1, (1, z_dim))
# 生成假图像
gen_imgs = generator.predict(noise)
# 反标准化输出图像
gen_imgs = 0.5 * gen_imgs + 0.5
# 保存生成的图像
plt.imshow(gen_imgs[0, :, :, 0], cmap='gray')
plt.savefig("images/%d.png" % epoch)
```
这个代码实现了一个简单的深度卷积生成对抗网络,用于生成 MNIST 数字图像。在训练过程中,它首先训练鉴别器,然后再训练生成器,以最小化鉴别器对假图像的判断。最后,它生成一些样本图像并将它们保存到磁盘上。