Как реализовать пользовательскую взвешенную функцию потерь MSE в Keras? - PullRequest
0 голосов
/ 02 ноября 2019

Я хотел использовать пользовательский MSE для автоэнкодера. У меня есть входное (X) и выходное (Y) изображение Autoencoder, которые на самом деле одно и то же изображение. теперь во время вычисления MSE мы вычисляем MSE между истинным выходом (Y = X) и прогнозируемым выходным изображением (Y ').

Допустим, для каждого изображения XI есть производное изображение X ', которое является весовой матрицей для этого изображения. Размер X 'такой же, как X или Y. Он содержит значения от 0 до 1. Таким образом, при расчете MSE я хотел бы использовать X (который также является Y и ожидаемым восстановленным выходом), X' и прогнозируемый выходной сигнал Y».

Буду очень благодарен, если кто-нибудь подскажет мне, как это можно реализовать в Керасе.

1 Ответ

2 голосов
/ 02 ноября 2019

Вы можете создать слой потерь, подобный этому

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)
...