Это продолжение поста: Расчет потерь в dcgan , который получил выбранный ответ, но мне он не подходит.
Подводя итог: В учебник по тензорному потоку о dcgan они определили функцию потерь следующим образом:
def generator_loss(generated_output):
return tf.losses.sigmoid_cross_entropy(tf.ones_like(generated_output), generated_output)
Вопрос в том, почему они используют "tf.ones_like (generate_output)".Ответ, данный Дэвидом Парксом на упомянутый предыдущий пост, был таков:
Выход дискриминаторов находится в диапазоне [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)
Я думал, что эта конструкция дискриминатора может быть ошибкой, и тот факт, что он все еще работает, возможно, случайность.Поэтому я попытался добавить слой активации сигмоида к дискриминатору, но это серьезно ухудшило производительность.Его вывод выглядит примерно так после нескольких эпох:
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)
Так что теперь я полностью потерян.Есть ли другое объяснение?Я пытаюсь переделать сценарий для создания других (цветных) изображений, но он не будет учиться (он только генерирует сумасшедший шум), и я подозреваю, что это может быть одной из причин.