Как получить доступ к значениям y_true в пользовательской функции стоимости? - PullRequest
0 голосов
/ 02 августа 2020

Я хочу написать специальную функцию стоимости, в которой я хочу получить доступ к значениям y_true и y_pred. Как и в этом примере, они напрямую используют y_pred - y_true, но я хочу получить доступ к этим элементам для некоторых других манипуляций.

def custom_loss(layer):
    def loss(y_true,y_pred):
        return K.mean(K.square(y_pred - y_true) + K.square(layer), axis=-1)
    return loss

Итак, как я могу использовать эти элементы?

1 Ответ

1 голос
/ 02 августа 2020

Вы можете использовать их так же, как вы бы манипулировали массивом numpy, хотя на этот раз y_true и y_pred являются тензорами, а не numpy массивами.

Посмотрите на этот пример:

def triplet_loss(y_true, y_pred, cosine=True, alpha=0.2, embedding_size=128):
    ind = int(embedding_size * 2)
    print('Shape of y pred is:', y_pred.shape)
    a_pred = y_pred[:, :embedding_size]
    p_pred = y_pred[:, embedding_size:ind]
    n_pred = y_pred[:, ind:]

    if cosine:
        positive_distance = 1 - K.sum((a_pred * p_pred), axis=-1)
        negative_distance = 1 - K.sum((a_pred * n_pred), axis=-1)
    else:
        positive_distance = K.sqrt(K.sum(K.square(a_pred - p_pred), axis=-1))
        negative_distance = K.sqrt(K.sum(K.square(a_pred - n_pred), axis=-1))
    loss = K.maximum(0.0, positive_distance - negative_distance + alpha)
    return loss

На самом деле это функция потерь для конкретной c проблемы в сиамских сетях; но суть в том, что y_pred управляется посредством нарезки.

Следовательно, вы можете нарезать / выбрать некоторые части y_true и y_pred в соответствии с вашими потребностями.

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