Получить длину y_pred и y_true в пользовательской метрике Keras - PullRequest
0 голосов
/ 10 февраля 2019

ИСТОРИЯ:

Я хочу получить равные len(x) и x.shape[0] для y_pred и y_true внутри пользовательской метрики Keras, не используя ничего, кромеБэкэнд Keras.

Рассмотрим пример минимальной метрики Keras:

from keras import backend as K

def binary_accuracy(y_true, y_pred):
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)

Здесь y_pred и y_true - тензоры, которые представляют собой массивы с определенными фигурами.

ВОПРОС:

Как получить длину базового массива внутри метрической функции keras, чтобы результирующий код имел вид:

def binary_accuracy(y_true, y_pred):
    # some Keras backend code 
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)

ПРИМЕЧАНИЕ:код должен быть кодом бэкэнда Keras, чтобы он работал на любом бэкенде Keras.

Я уже пробовал K.ndim(y_pred), который возвращает 2, хотя длина на самом деле 45, а K.int_shape(y_pred), который возвращает None.

Ответы [ 2 ]

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

Вы должны помнить, что в некоторых случаях форму данного символического тензора (например, y_true и y_pred в вашем случае) нельзя определить, пока вы не передадите значения определенным заполнителям, на которые опирается этот тензор.

Имея это в виду, у вас есть два варианта:

  1. Используйте K.int_shape (x), чтобы получить кортеж целых чисел и значений None, которые представляют форму входного тензора x.В этом случае размеры с неопределенной длиной будут Нет.Это полезно в тех случаях, когда ваш код, отличный от Tensorflow, не зависит от неопределенных измерений.Например, вы не можете сделать следующее:

    if K.shape(x)[0] == 5:
        ...
    else:
        ...
    
  2. Используйте K.shape(x), чтобы получить символический тензор , который представляет форму тензора x.Это полезно в тех случаях, когда вы хотите использовать форму тензора для изменения графика TF, например:

    t = tf.ones(shape=K.shape(x)[0])

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

Вы можете получить доступ к форме тензора через K.int_shape(x) Взяв первое значение результата, вы получите длину базового массива: K.int_shape(x)[0]

...