Comments 9
iphysic
Почему лэйблы добавляются и в discriminator? и зачем нам вообще нужен discriminator если мы можем генерировать изображение по лэйблу просто генератором?
Сначала по второму вопросу. Дискриминатор нужен только чтобы обучать генератор. Без него, генератор бы не мог научиться генерировать сэмплы. Когда генератор обучен, то дискриминатор уже не нужен. Стоит также отметить, что дискриминатор без генератора бесполезен, то есть мы не можем его обучить, а потом использовать для какой-нибудь другой задачи.

По первому вопросу. Мы можем не передавать лейблы в дискриминатор, но он тогда не будет использовать всю доступную информацию, а значит будет тяжелее учиться, что в свою очередь будет влиять на качество градиентов передаваемых в генератор, и он тоже будет хуже учиться.
А почему дискриминатор нельзя использовать, к примеру, для обнаружения образов или для их распознавания?
Он слишком сильно привязан к генератору, и по факту умеет только его сэмплы от настоящих отличать, да и обучался на довольно странном лосе. Чем то, думается, похоже по природе на adversarial examples, когда незначительные изменения во входе, могут сильно влиять на выход в нужную сторону. Впрочем первые свертки вполне могут выучивать что-то полезное, но это не точно.
Прочитав pix2pix arxiv.org/pdf/1611.07004.pdf стала понятна мотивация использования GAN, т.е. пишут что просто L1 loss дает более размытую картинку чем L1+cGAN. (но видимо cGAN даёт при этом кучу глитчей)
iphysic
Еще пара вопросов чего не хватает в keras чтобы реализвать GAN?
Не хватает variable_scrope чтоб потом взять подмножество переменных для генератора и дискриминатора?
generator_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "generator")
discrim_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "discrim")


Почему мы в при обучении делаем по несколько шагов (`k_step`) для генератора и дискриминатора?
На самом деле в Керасе всего хватает. И можно было бы несколько исхитриться и не приплетать сюда tensorflow, просто это было бы менее удобно, например не получилось бы использовать .fit() у модели, так как у моделей различные лоссы и обучаются они поддельности.

Нужно, чтобы модели обучались совместно, и чтобы дискриминатор не слишком обыгрывал генератор (тогда его градиенты уходят в ноль, ибо сигмоида). Эта проблема отчасти решается в Wasserstein GAN. В идеале было бы наоборот обучать генератор каждый раз до сходимости при шаге дискриминатора, но это не реально.
Отвечая на один из своих вопросов:

>чего не хватает в keras чтобы реализвать GAN?

Тут вот на чистом keras реализуют github.com/eriklindernoren/Keras-GAN/blob/master/cgan/cgan.py

Возможно это правда не очень красиво и ворнинг возникает
# /usr/local/lib/python3.6/dist-packages/keras/engine/training.py:490: UserWarning: Discrepancy between trainable weights and collected trainable weights, did you set `model.trainable` without calling `model.compile` after ?
#   'Discrepancy between trainable weights and collected trainable'
Only those users with full accounts are able to leave comments. Log in, please.