Я пытаюсь выяснить, как я буду использовать информацию метки моего набора данных с помощью Generative Adversarial Networks. Я пытаюсь использовать следующую реализацию условных GAN, которые можно найти здесь. Мой набор данных содержит два разных домена изображения (реальные объекты и эскизы) с общей информацией о классе (стул, дерево, оранжевый и т.д.). Я выбрал эту реализацию, которая рассматривает только два разных домена как разные "классы" для соответствия (образцы образцов X
соответствуют реальным изображениям, тогда как целевые образцы y
соответствуют изображениям эскиза).
Есть ли способ изменить мой код и принять во внимание информацию о классе (стул, дерево и т.д.) Во всей моей архитектуре? Я хочу, чтобы на самом деле мой дискриминатор предсказывал, относятся ли мои сгенерированные образы от генератора к определенному классу, а не только то, являются ли они реальными или нет. Как и в случае с текущей архитектурой, система во всех случаях пытается создавать похожие эскизы.
Обновление: дискриминатор возвращает тензор размера 1x7x7
после чего оба y_true
и y_pred
проходят через слой сглаживания перед вычислением потери:
def discriminator_loss(y_true, y_pred):
BATCH_SIZE=100
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=100
return K.mean(K.binary_crossentropy(K.flatten(y_pred), K.ones_like(K.flatten(y_pred))), axis=-1)
Furthremore, моя модификация модели дискриминатора для уровня 1 вывода:
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
#model.add(Activation('sigmoid'))
Теперь дискриминатор выводит 1 слой. Как я могу изменить вышеупомянутые функции потерь соответственно? Должен ли я иметь 7 вместо 1, для n_classes = 6
+ один класс для прогнозирования реальных и поддельных пар?