问题描述
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()
)时,分别对真实和假样本进行培训至关重要,因为可以区分真实样本和假样本的批次统计信息。