Взвешенная функция пользовательских потерь mse в кератах - пользовательские веса - PullRequest
0 голосов
/ 01 февраля 2019

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

В принципе, для каждой позиции индекса argmax в матрице последовательности я могу получить символ.Для каждых двух символов я могу получить вес.Словари для них, как показано ниже:

values = 
     {0: 'A',
      1: 'C',
      2: 'D',
      ...}
matrix = array
     ([[ 4, -1, -2, -2,  0, -1, -1,  0, -2, -1, -1, -1, -1, -2, -1,  1,
         0, -3, -2,  0, -2, -1,  0, -4],
       [-1,  5,  0, -2, -3,  1,  0, -2,  0, -3, -2,  2, -1, -3, -2, -1,
        -1, -3, -2, -3, -1,  0, -1, -4],
       [-2,  0,  6,  1, -3,  0,  0,  0,  1, -3, -3,  0, -2, -3, -2,  1,
         0, -4, -2, -3,  3,  0, -1, -4],
       ...]])

Я хочу сделать что-то вроде этого:

y_true (n,155,20) ---K.argmax(.., axis=2)---> a:(n,155)

y_pred (n,155,20) ---K.argmax(.., axis=2)---> b:(n,155)

for i in range(n):
   for j in range(155):
      weights[i,j] = matrix[values[a[i,j]], values[b[i,j]]]

Представьте, что есть способ получить значения матрицы выше с помощью некоторого другого слова.

Тогда я хочу использовать свою матрицу weights следующим образом:

def custom_loss_mse(y_true,y_pred):
    w = getWeights(y_true,y_pred)
    return K.mean(K.dot(w, K.square(y_pred-y_true)), axis=-1)

До сих пор я нашел только этот вопрос полезным, и он не очень похож.

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

Буду признателен за любую помощь, так как я довольно новичок в numpy и keras.

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете использовать tf.gather, чтобы получить значения тензора по определенному индексу.Например, вы можете создать a с помощью следующего кода:

index = K.argmax(y_true, axis=2)
a = tf.diag_part(tf.gather(y_true, index, axis=2))  # shape (n, 155)

Я не думаю, что можно получить значения из dict, поскольку все вычисления должны быть символическими.Но если вы можете использовать матрицу вместо dict, вы можете преобразовать матрицу в тензор с помощью K.constant, а затем использовать тот же подход, что и выше, для получения значений по определенному индексу, в зависимости от входных тензоров.

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