这是该帖子的后续内容: Calculating loss in dcgan已选择答案,但对我来说似乎不合适。
总结:在tensor flow tutorial about dcgan中,他们定义了这样的损失函数:
def generator_loss(generated_output):
return tf.losses.sigmoid_cross_entropy(tf.ones_like(generated_output), generated_output)
问题是为什么他们使用“ tf.ones_like(generated_output)”。大卫·帕克斯(David Parks)对前面提到的帖子的回答是,这是因为
鉴别器输出在[0,1]范围内
我以为是这种情况,但后来我发现鉴别器实际上并没有返回0到1之间的值。
鉴别符的定义以:
结尾model.add(tf.keras.layers.Dense(1))
而不是:
model.add(tf.keras.layers.Dense(1))
model.add(tf.keras.layers.Activation("sigmoid"))
如我所愿。
4个生成的图片和4个真实图片的鉴别器的输出(经过几个时期)实际上看起来像:
GENERATED: tf.Tensor(
[[-1.5261561 ]
[-2.6044064 ]
[-0.55789095]
[-1.0553275 ]], shape=(4, 1), dtype=float32)
REAL: tf.Tensor(
[[ 2.048546 ]
[ 2.900073 ]
[-2.3295398]
[-1.098418 ]], shape=(4, 1), dtype=float32)
我认为区分器的这种设计可能是一个错误,并且事实上仍然可行,这也许是偶然的。因此,我尝试将S型激活层添加到鉴别器中,但这实际上严重降低了性能。经过几个时期后,它的输出看起来像这样:
GENERATED: tf.Tensor(
[[1.5318394e-05]
[5.3527951e-04]
[3.1036139e-04]
[6.9439411e-06]], shape=(4, 1), dtype=float32)
REAL: tf.Tensor(
[[1.1146069e-05]
[1.4841557e-05]
[5.9306622e-06]
[5.2452087e-06]], shape=(4, 1), dtype=float32)
所以现在我完全迷路了。还有其他解释吗?我正在尝试重新制作脚本以生成其他(彩色)图像,但是它不会学习(它只会生成疯狂的噪音),我怀疑这可能是原因的一部分。