Я тренирую SRGAN для суперразрешения изображений. У меня есть генератор и дискриминатор. Входными данными для комбинированной модели являются изображения низкого разрешения и сверхразрешения. И выходы - это вероятность классификации по дискриминатору и выходное изображение, сгенерированное генератором.
И теперь я собираю модель, как показано ниже:
def ensstrophy_loss(y, y_pred):
en_hr = tf.math.square(y[:,:,:,1])
en_sr = tf.math.square(y_pred[:,:,:,1])
return K.mean(K.square(en_hr - en_sr), axis=-1)
# Generate high res. data from low res.
fake_hr = self.generator(img_lr)
# Discriminator determines validity of generated high res. images
validity = self.discriminator(fake_hr)
self.combined = Model([img_lr, img_hr], [validity, fake_hr, fake_hr])
self.combined.compile(loss=['binary_crossentropy', 'mse', ensstrophy_loss],
loss_weights=[1e-3, 1, 1e-1],
optimizer=optimizer)
И обучаю модель, как показано ниже:
# Train the compiled model
g_loss = self.combined.train_on_batch([imgs_lr, imgs_hr], [valid, imgs_hr, imgs_hr])
Во время выполнения кода я получаю предупреждение что «График не может быть отсортирован в топологическом порядке». Я делаю что-то неправильно?
Я могу сделать то же самое с двумя выходами. Как вы видите, у меня есть два одинаковых вывода (fake_hr) в приведенном выше коде. Я могу определить пользовательскую функцию потерь, которая будет комбинацией mse и ensstrophy_loss. Но я хотел бы проследить, как эти два компонента меняются в процессе обучения. Есть ли другой способ сделать это?
Спасибо.