Можно ли отображать сумму по партиям вместо среднего по партиям как потери в кератах? - PullRequest
1 голос
/ 26 апреля 2020

У меня задание регрессии, и я измеряю подгонку, используя евклидово расстояние. Вместо того, чтобы отображать среднеквадратичную ошибку как потерю, я хочу отобразить сумму квадратов. То есть я хочу только сумму по квадратным ошибкам и не делить на количество примеров.

На уровне пакета я могу достичь этого, определив пользовательские потери вроде этого (возможно, я мог бы вместо этого использовать tf.keras.losses.MeanSquareError напрямую):

class CustomLoss(tf.keras.losses.Loss):
    def call(self, Y_true, Y_pred):
        return tf.reduce_sum(tf.math.abs(Y_true-Y_pred) ** 2, axis=-1)

target_loss=CustomLoss(reduction=tf.keras.losses.Reduction.SUM)

, который вычислит квадратную ошибку для каждого примера, а затем даст TensorFlow команду SUM над примерами для вычисления потери пакета вместо этого по умолчанию SUM_OVER_BATCH_SIZE (который должен читаться не буквально, а в виде дроби, т. е. SUM / BATCH_SIZE).

Моя проблема в том, что на уровне эпохи Керас берет эти суммы, а затем вычисляет Имеется в виду через шаги (партии), чтобы сообщить о потере эпохи. Как мне заставить Keras вычислять сумму по партиям вместо среднего?

1 Ответ

0 голосов
/ 26 апреля 2020

Вам нужно будет написать Пользовательский обратный вызов , который будет добавлять потери после каждого пакета в список (как показано в общей ссылке до c).

Реализация on_epoch_end чтобы получить сумму всех значений в списке (в который вы добавили все потери серии)

Если вы хотите минимизировать сумму потерь по всем партиям, используйте K.Function API. Полная реализация

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