У меня есть модель с несколькими выходами, потери для каждого выхода могут зависеть от одного из других выходов, а также от некоторых масок, вычисленных по данным. Общая потеря модели представляет собой взвешенную сумму над потерями.
Моя модель имеет подклассы tf.keras.Model
, и я пытаюсь написать чистый код, который можно использовать с compile
и fit
. Мне бы хотелось, чтобы веса потерь были даны во время компиляции.
Один из найденных способов решения проблемы зависимостей потерь (после прочтения некоторой документации и этого ответа ) состоит в том, чтобы кормить маскирует тип данных как входные данные модели и, при реализации call
, добавляет потерю каждого вывода с помощью Model.add_loss
. Может кто-нибудь подтвердить мне это? Как мне получить y_true
оттуда?
Если это хорошее решение, как мне указать, что общая потеря модели представляет собой взвешенную сумму этих потерь в течение compile
, как я могу получить к ним доступ? ?
Также было бы лучше использовать add_loss
на каждом слое при реализации модели call
? Тот же вопрос, как я могу получить к ним доступ во время compile
?
Если это не было хорошим решением, то что является хорошим?
import tensorflow as tf
class MyModel(tf.keras.Model):
def __init__(self, base_trainable=False, feature_extractor=None, n=4, *kwargs):
super(MyModel, self).__init__(*kwargs)
if feature_extractor:
self.feature_extractor = feature_extractor
else:
feature_extractor = tf.keras.applications.Resnet101(include_top=False,
weights='imagenet',
trainable=base_trainable)
self.out1 = layers.Conv2D(n, kernel_size=(1,1), activation='sigmoid', name='out1')
self.out2 = layers.Conv2D(n, kernel_size=(1,1), name='out2')
self.out3 = layers.Conv2D(2*n, kernel_size=(1,1), 'out3')
def call(self, inputs):
img, mask1, mask2 = inputs
x = self.feature_extractor(img)
out1 = self.out1(x)
out2 = self.out2(x)
out3 = self.out3(x)
# compute losses for each output? (but how do I access to each y_true?...)
# ex:
#
# model.add_loss(my_loss_for_out1(y1_true??
# out1,
# out2))
# model.add_loss(my_loss_for_out1(y2_true??
# out2,
# mask1))
# model.add_loss(my_loss_for_out1(y3_true??
# out3,
# mask2))
return out1, out2, out3
model = MyModel()
model.compile(loss=???
loss_weights=???)
Спасибо