我正在训练一个 GAN 来执行来自两个不同图像域(源S
和目标T
)的风格转换。因为我有可用的类信息,所以我有一个额外的Q
网络(除了G
和D
),它测量目标域及其标签(LeNet 网络)的生成图像的分类结果,并将错误传播到生成器D
。从系统的收敛中我注意到它D
总是从 8(D
网络的损失函数误差)开始并略微下降到 4.5,G
损失函数误差从 1 开始并迅速下降到 0.2。D
和G
我正在使用的损失函数可以在这里找到,而Q
网络是分类交叉熵。迭代的误差图是:
D和G的损失函数为:
def discriminator_loss(y_true,y_pred):
BATCH_SIZE=10
return K.mean(K.binary_crossentropy(K.flatten(y_pred), K.concatenate([K.ones_like(K.flatten(y_pred[:BATCH_SIZE,:,:,:])),K.zeros_like(K.flatten(y_pred[:BATCH_SIZE,:,:,:])) ]) ), axis=-1)
def discriminator_on_generator_loss(y_true,y_pred):
BATCH_SIZE=10
return K.mean(K.binary_crossentropy(K.flatten(y_pred), K.ones_like(K.flatten(y_pred))), axis=-1)
def generator_l1_loss(y_true,y_pred):
BATCH_SIZE=10
return K.mean(K.abs(K.flatten(y_pred) - K.flatten(y_true)), axis=-1)
D 的误差函数总是那么高有意义吗?D
和的错误的解释是什么G
?是不是D
一开始的损失应该很小,迭代后会上升?用损失阈值限制D
过度是否是个好主意?G
最后,在训练期间,从验证集上的损失函数而不是我正在使用的训练集计算误差是否有意义?(而不是直接使用 train_on_batch 使用 fit 然后在测试集上进行评估)。
编辑:
对于损失,我认为discriminator
和 的discriminator_on_generator
损失是 GAN 的正常损失函数,对吧?