Предположим, что у нас есть 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
. Любые идеи, как решить эту проблему?
На самом деле уже есть ответ, подходящий для этой проблемы. Берегитесь здесь