Как я могу использовать взвешенную MSE в качестве функции потерь в модели Кераса? - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь использовать настраиваемую функцию потерь для расчета взвешенной MSE в регрессии (значения в задаче: -1, -0,5, 0, 0,5, 1, 1,5, 3 и т. Д. c.). Вот моя реализация настраиваемой функции потерь:

import tensorflow
import tensorflow.keras.backend as kb

def weighted_mse(y, yhat):
    ind_losses = tensorflow.keras.losses.mean_squared_error(y, yhat)
    weights_ind = kb.map_fn(lambda yi: weight_dict[kb.get_value(yi)], y, dtype='float32')
    # average loss over weighted sum of the batch
    return tensorflow.math.divide(tensorflow.math.reduce_sum(tensorflow.math.multiply(ind_losses, weights_ind)), len(y))

Я запускаю пример, который работает:

weight_dict = {-1.0: 70.78125, 0.0: 1.7224334600760458, 0.5: 4.58502024291498, 1.0: 7.524916943521595, 1.5: 32.357142857142854, 2.0: 50.33333333333333, 2.5: 566.25, 3.0: 566.25}
y_true = tensorflow.convert_to_tensor([[0.5],[3]])
y_pred = tensorflow.convert_to_tensor([[0.5],[0]])

weighted_mse(y_true, y_pred)

Но при вводе в мою модель возникает следующая ошибка:

AttributeError: 'Tensor' object has no attribute '_numpy'

Вот как я использую пользовательскую функцию потери:

    model.compile(
    optimizer=opt,
    loss={
        "predicted_class": weighted_mse
    })

EDIT:

при изменении weight_dict[kb.get_value(yi)] на weight_dict[float(yi)] Я получаю следующую ошибку:

TypeError: float() argument must be a string or a number, not 'builtin_function_or_method'

Ответы [ 2 ]

1 голос
/ 14 июля 2020

То, что вы хотите, - это, по сути, идея веса образца. При использовании обучающего API Keras вместе с данными вы можете передать другой массив, содержащий вес для каждой выборки, который используется для определения вклада каждой выборки в функцию потерь.

Чтобы использовать его, вы можете использовать sample_weight аргумент метода fit:

model.fit(X, y, sample_weight=X_weight, ...)

Обратите внимание, что X_weight должен быть массивом той же длины, что и X (т.е. одно значение веса для каждой обучающей выборки). Кроме того, если X является экземпляром tf.data.Dataset или генератором, этот аргумент не работает, и вместо этого вам нужно передать вес образца в качестве третьего элемента кортежа, возвращаемого X.

0 голосов
/ 14 июля 2020

Обычно это происходит в старой версии tensorflow. Вы можете попробовать 2 вещи:

  1. Добавьте эту строку в блокнот jupyter, когда вы импортируете тензорный поток, например:
import tensorflow as tf
tf.enable_eager_execution()
Обновите тензорный поток с помощью следующей команды в приглашении:
pip install tensorflow --upgrade

Это, скорее всего, из-за активного выполнения. См. Документы здесь для получения дополнительной информации.

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