Отладка значений тензора keras

Я реализую собственную функцию потери keras. Как получить доступ к значениям тензора?

Что я пробовал

def loss_fn(y_true, y_pred):
    print y_true

Он печатает

Tensor("target:0", shape=(?, ?), dtype=float32)

Есть ли функция keras для доступа к значениям y_true?

Ответ 1

print_tensor имеет print_tensor который позволяет вам это делать. Вы можете использовать его так:

import keras.backend as K

def loss_fn(y_true, y_pred):
    y_true = K.print_tensor(y_true, message='y_true = ')
    y_pred = K.print_tensor(y_pred, message='y_pred = ')
    ...

Функция возвращает идентичный тензор. Когда этот тензор будет оценен, он распечатает свой контент, которому предшествует message. Из документов Keras:

Обратите внимание, что print_tensor возвращает новый тензор, идентичный x, который должен использоваться в следующем коде. В противном случае операция печати не учитывается во время оценки.

Поэтому обязательно используйте тензор.

Ответ 2

Как правило, y_true вы знаете заранее - во время подготовки вашего поезда...

Однако есть один трюк, чтобы увидеть значения внутри y_true и/или y_pred. Keras дает вам возможность написать соответствующий обратный вызов для печати вывода нейронной сети. Он будет выглядеть примерно так:

def loss_fn(y_true, y_pred):
    return y_true # or y_pred
...
import keras.callbacks as cbks
class CustomMetrics(cbks.Callback):

    def on_epoch_end(self, epoch, logs=None):
        for k in logs:
            if k.endswith('loss_fn'):
               print logs[k]

Здесь loss_fn является именем вашей функции потерь, когда вы передаете ее в model.compile(...,metrics=[loss_fn],) во время компиляции модели.

Итак, наконец, вы должны передать этот CustomMetrics вызов CustomMetrics в качестве аргумента в model.fit():

model.fit(x=train_X, y=train_Y, ... , callbacks=[CustomMetrics()])

PS: Если вы используете Theano (или TensorFlow), как здесь, в Keras, вы пишите программу python, а затем компилируете ее и выполняете. Итак, в вашем примере y_true - это просто тензорная переменная, которая используется для дальнейшего подсчета функций компиляции и потери.

Это означает, что нет возможности увидеть значения внутри него. Например, в Theano вы можете заглянуть внутрь только так называемой общей переменной после выполнения соответствующей функции eval(). См. Этот вопрос для получения дополнительной информации.

Ответ 3

Если вы используете кера TensorFlow, вы можете включить Eager Execution:

import tensorflow as tf 
tf.enable_eager_execution()

После этого вы можете распечатать тензоры в вашей функции потерь.

В случае, если вы получите сообщение об ошибке "ValueError: В режиме Eager поддерживаются только собственные оптимизаторы TF". и вы использовали 'adam' в качестве оптимизатора, например, вы можете изменить аргументы компиляции модели на

model.compile(optimizer = tf.train.AdamOptimizer(), loss = loss_fn, ...)

Ответ 4

я использую

print("y_true = " + str(y_true.eval()))

для отладки.

Ответ 5

Вы не можете напрямую получить значения из символической переменной тензора. Чтобы извлечь значение, нужно написать функцию anano. Не забывайте выбирать анано как основу Keras.

Проверьте ссылку на ноутбук, чтобы получить некоторые основные переменные и функции anano: получить значение тензора в функции вызова собственных слоев

Ответ 6

Вы можете переопределить свою функцию потерь, чтобы вместо нее вернуть значение:

def loss_fn(y_true, y_pred):
    return y_true

Давайте создадим несколько тензоров:

from keras import backend as K

a = K.constant([1,2,3])
b = K.constant([4,5,6])

И используйте API-интерфейс keras.backend.eval() для оценки вашей функции потерь:

loss = loss_fn(a,b)
K.eval(loss)
# array([1., 2., 3.], dtype=float32)