Манипулировать множественными потерями керас - PullRequest
0 голосов
/ 18 апреля 2020

Предположим, что у нас есть model_A, и мы хотим построить обратное распространение на основе 3 различных функций потерь. Первая потеря (Loss_1) должна основываться на выводе model_A, Loss_2 и Loss_3 может происходить из чего-то еще. Думайте об этом как об отклонении от неизвестного источника, как в автоматизации процессов, если вы хотите создать свой ПИД-контроллер. Самый простой способ - это мой подход, но на самом деле он терпит неудачу, потому что граф построен не так, как я хочу, потому что X_realB и X_realC не имеют связи с model_A и игнорируются керасом.

Есть идеи, как использовать дополнительные функции потерь, не передавая значения через model_A, но все же влияя на проблему минимизации?

def generator_model(model_A):

  model_A.trainable = True

# import
  X_realA = Input(shape=image_shape)
  X_realB = Input(shape=image_shape)
  X_realC = Input(shape=image_shape)

# generate Fake image
  Fake_A=model_A(X_realA)


  model = Model([X_realA],[Fake_A,X_realB ,X_realC])

  opt = Adam(lr=0.0002, beta_1=0.5)
  model.compile(loss=["mse","mse","mse"],loss_weights=[1,1,1], optimizer=opt)
  model.summary()
  return model

И второй вопрос: есть ли способ использовать недифференцируемые элементы в пользовательских слоях keras, таких как tf.unique (подсчет элементов в тензорах), между двумя моделями, такими как:

# import
  X_realA = Input(shape=image_shape)

# generate Fake image
  Fake_A=model_A(X_realA)

  # counting the elements and reshape the tensor
  _,_,counts = keras.layers.Lambda(lambda x: tf.unique_with_counts(x))(Fake_A)
  new_Fake_A= keras.layers.Lambda(lambda x: tf.reshape(x,(something,something)))(counts)

  Fake_B=model_B(new_Fake_A)  

  model = Model([X_realA],[Fake_A,Fake_B])

Но при таком подходе модель не работает должным образом и не обновляет веса model_A. Возможно, потому, что tf.unique_count создает новые тензоры, которые не имеют связи со старыми, и градиентов тоже нет, но в любом случае это lambda.layer. Любые идеи, как решить эту проблему?

На самом деле уже есть ответ, подходящий для этой проблемы. Берегитесь здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...