Пользовательские потери с условным возвращаемым значением - PullRequest
1 голос
/ 21 июня 2019

Мне нужна функция потерь с этой регуляризацией: для каждого прогноза, если прогнозируемая точка имеет норму ниже 0,9 или больше 1, я хочу применить регуляризацию.

Итак, я написал это:

def custom_loss(y_true, y_pred):

ret = keras.losses.mean_squared_error(y_true, y_pred)

n = tf.norm(y_pred, axis = 1)
intern_circle_distance = n - 0.9        
return tf.where(tf.logical_and(tf.greater(intern_circle_distance, 0),
                               tf.less(intern_circle_distance, 0.1))
                        ret,
                        ret*2)

Когда я использую это в файле model.com, возвращается ошибка:

Фигуры должны быть одинакового ранга, но равны 0 и 1 для 'loss_71 / Hyper_loss / Select' (op: 'Select') с входными фигурами: [?], [], [].

Я попробовал потерю вне среды Кераса, и, похоже, это работает. Например это:

a = tf.constant([[-1.0, 1.5]])
n = a - 1
K.eval(tf.where(tf.logical_and(tf.greater(n, 0)),
                               tf.less(n, 2)),
                a, a*2))

возвращает мне Тензор [-2., 1,5]

Почему он работает вне функции потери керасы и не работает внутри функции потери керасы? Как это может работать внутри функции потери keras?

1 Ответ

0 голосов
/ 21 июня 2019

keras.losses.mean_squared_error дает скалярное число, среднее значение всех квадратов ошибок. Если вы хотите изменить расчет ошибок для каждого примера, сделайте что-то вроде этого:

def custom_loss(y_true, y_pred):
    diff = tf.squared_difference(y_true, y_pred)
    n = tf.norm(y_pred, axis=1)
    intern_circle_distance = n - 0.9
    diff_reg = tf.where((intern_circle_distance > 0) & (intern_circle_distance <0.1))
                        diff, 2 * diff)
    return tf.reduce_mean(diff_reg)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...