我正在用 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)