Как получить сеанс в определенной метрике? - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь запустить пользовательскую метрику в Керасе. Мне это удалось, но я не доверяю его результатам, поэтому я хотел бы проверить некоторые ценности. Проблема в том, что все в тензорах, и я хотел бы преобразовать их в ndarrays для их проверки. Чтобы преобразовать их, я должен провести сессию для их оценки. Когда я пытаюсь получить сеанс с помощью бэкенда Keras, я получаю сообщение об ошибке:

InvalidArgumentError (см. Выше для отслеживания): вы должны передать значение для тензора заполнителя 'Dense_1_target_1' с dtype float и shape [?,?] [[Узел: Dense_1_target_1 = Placeholderdtype = DT_FLOAT, shape = [?,?], _Device = "/ job: localhost / replica: 0 / task: 0 / device: GPU: 0"]]

Единственное, что мне нужно, - это возможность распечатать некоторую информацию о тензорах: значения, формы и т. Д.

from keras import backend as K

def t_zeros(Y_true, y_pred):
""" Just count # zero's in Y_true and try to print some info """
    threshold = 0.5
    true_zeros = K.less(Y_true, threshold) # element-wise True where Y_true < theshold
    true_zeros = K.cast(true_zeros, K.floatx())  # cast to 0.0 / 1.0
    n_zeros = K.sum(true_zeros)

    sess = K.get_session()
    y_t = Y_true.eval(session=sess) # <== error happens here
    print(y_t.shape)

    return n_zeros

1 Ответ

0 голосов
/ 07 сентября 2018

Помните, что тензор потока использует отложенную оценку.

Так что вы не можете print значение в вашей функции. Вам нужно создать узел печати и подключить его к общему графику.

Как то так

def t_zeros(Y_true, y_pred):
""" Just count # zero's in Y_true and try to print some info """
    threshold = 0.5
    true_zeros = K.less(Y_true, threshold) # element-wise True where Y_true < theshold
    true_zeros = K.cast(true_zeros, K.floatx())  # cast to 0.0 / 1.0
    n_zeros = K.sum(true_zeros)

    return tf.Print(n_zeros, [n_zeros]) 

... 
my_metric = t_zeros(Y_true, y_pred)  # Returns the tensor, but we need to make sure it's evaluated
...
train_op = tf.group(train_op, my_metric) 

Вы можете подключить его к другим операциям, если хотите, просто убедитесь, что он оценивается.

...