来自 GAN 的奇怪模式

数据挖掘 深度学习 喀拉斯 卷积 生成模型
2021-09-28 15:55:22

我正在用 GAN 做实验。我已经在 28x28px MNIST 数据集上成功训练了 GAN(样本缩放到(-1,1)间隔)

我的下一个实验是在更大的图像上训练 GAN。我的数据集由灰度 128x128px 图像组成。我已经为生成器和鉴别器添加了一个卷积层,并相应地更新了密集层。

来自 MNIST 数据集的样本和来自我的自定义数据集的样本: 在此处输入图像描述

但是,当我训练模型时,生成器的所有结果如下所示:

单个样品

我究竟做错了什么?为什么生成器只生成这种噪声模式而不是从我的数据集分布中生成样本?

发电机:

H = Sequential()

H.add(Dense(1024, input_shape=(noise_dim,)))
H.add(BatchNormalization())
H.add(Activation('relu'))

H.add(Dense(128*16*16))
H.add(BatchNormalization())
H.add(Activation('relu'))
H.add(Reshape([16, 16, 128]))

H.add(Conv2DTranspose(128, (3, 3), strides=(2, 2), padding='same'))
H.add(BatchNormalization())
H.add(Activation('relu'))

H.add(Conv2DTranspose(64, (3, 3), strides=(2, 2), padding='same'))
H.add(BatchNormalization())
H.add(Activation('relu'))

H.add(Conv2DTranspose(32, (3, 3), strides=(2, 2), padding='same'))
H.add(BatchNormalization())
H.add(Activation('relu'))

H.add(Conv2DTranspose(1, (3, 3), padding='same'))
H.add(Activation('tanh', name='out_image'))

gen_in = Input(shape=(noise_dim,), name='in_noise')
gen_out = H(gen_in)

鉴别器:

H = Sequential()

H.add(Conv2D(32, (3, 3), strides=(2, 2), padding='same', activation='relu', input_shape=(128, 128, 1)))
H.add(LeakyReLU(0.2))

H.add(Conv2D(64, (3, 3), strides=(2, 2), padding='same', activation='relu'))
H.add(BatchNormalization())
H.add(LeakyReLU(0.2))

H.add(Conv2D(128, (3, 3), strides=(2, 2), padding='same', activation='relu'))
H.add(BatchNormalization())
H.add(LeakyReLU(0.2))
H.add(Flatten())

H.add(Dense(1024))
H.add(BatchNormalization())
H.add(LeakyReLU(0.2))

H.add(Dense(1, activation='sigmoid', name='out_binary'))

disc_in = Input(shape=(128, 128, 1), name='in_image')
disc_out = H(disc_in)
2个回答

deconv 层可能是罪魁祸首。查看这篇distill文章,对 deconv 层如何创建棋盘工件进行了相当深入的讨论。要点是反卷积跨步会产生干涉图案,如果你小心的话,它可以抵消,但当你添加更多反卷积层时,它更有可能变得更糟。作者建议使用最近邻进行上采样,然后使用卷积层,他们称之为调整大小卷积上采样。

在此处输入图像描述

随着输入维数的增加,训练 GAN 变得更加困难。我遇到过有时即使是对网络的微小更改也可以决定网络的收敛/发散(例如变量的初始化)。

我建议遵循https://github.com/soumith/ganhacks的提示。

我个人认识到的另一件事是,您不应该像在当前网络中那样使用尽可能多的 Conv2DTranspose 层。尝试增加潜在空间。