Keras鉴别器训练功能-应该将假冒与真实联系起来吗?

问题描述

我注意到discriminator训练函数的一些版本。

batch_size = 100

# set_trainability
D.trainable = True

# create noise
noise = np.abs(np.random.randn(batch_size,100))

# fake
x_fake = G.predict(noise)
y_fake = np.zeros((batch_size,2))
y_fake[:,0] = 1

# real
x_real = np.array([sample_data_pp(num=100)[0] for i in range(batch_size)])
y_real = np.zeros((batch_size,2))
y_real[:,1] = 1

我应该串联fake and real吗?或“单独”培训他们。
为什么(如果有)会有区别?
例如,

D.train_on_batch(x_fake,y_fake)
D.train_on_batch(x_real,y_real)

或:

x_train = np.concatenate((x_fake,x_real))
y_train = np.concatenate((y_fake,y_real))
D.train_on_batch(x_train,y_train)

解决方法

生成对抗网络非常不稳定,如果不亲自尝试并评估结果,很难知道什么将起作用。

话虽如此,以我的经验,将真实和伪造的样本分开是一种好习惯。请参阅here以获取参考。

我相信,当使用批次归一化(keras.layers.BatchNormalization())时,分别对真实和假样本进行培训至关重要,因为可以区分真实样本和假样本的批次统计信息。