Вы можете создать слой потерь, подобный этому
class LossLayer(Layer):
def __init__(self, **kwargs):
super(LossLayer, self).__init__(**kwargs)
def build(self, input_shape):
super(LossLayer, self).build(input_shape) # Be sure to call this somewhere!
def call(self, x):
input_image, weighted_image, predicted = x
loss = weightedmse(input_image, weighted_image, predicted)
return loss
def dummy_loss(y_true, y_pred):
return tf.sqrt(tf.reduce_sum(y_pred))
Используйте его следующим образом при построении модели.
input_image = Input(...)
weighted_image = Input(...)
x = Conv2D(...)(input_image)
.
.
loss_layer = LossLayer()([input_image, weighted_image, x]) # x here is the last Conv layer
Ваш генератор данных должен вернуть что-то подобное в __getitem___
[input_img, weighted], np.zeros((batch_size, 1))
Редактировать
После разграничения приведенных выше тензоров создайте 2 модели, подобные этой
train_model = Model([input_image, weighted_image], loss_layer)
pridict_model = Model([input_image, weighted_image], x)
train_model.compile(optimizer='sgd', loss=dummy_loss)