Отладка промежуточного слоя keras или объективных переменных с tensorflow

Я пишу пользовательскую цель для обучения модели Keras (с бэкэндом tensorflow), но мне нужно отладить некоторые промежуточные вычисления. Для простоты скажем так:--2-->

def custom_loss(y_pred, y_true):
    diff = y_pred - y_true
    return K.square(diff)

Я не смог найти простой способ доступа, например, к промежуточной переменной diff или ее форме во время обучения. В этом простом примере я знаю, что могу вернуть diff для печати его значений, но моя фактическая потеря более сложна, и я не могу вернуть промежуточные значения без компиляции ошибки.

есть ли простой способ отладки промежуточных переменных в Keras?

1 ответов


это не то, что решается в Keras, насколько я знаю, поэтому вам нужно прибегнуть к функциям бэкэнда. Оба!--7-->Феано и TensorFlow есть Print узлы, которые являются узлами идентификации (т. е. они возвращают входной узел) и имеют побочный эффект печати ввода (или некоторого тензора ввода).

пример для Theano:

diff = y_pred - y_true
diff = theano.printing.Print('shape of diff', attrs=['shape'])(diff)
return K.square(diff)

пример для TensorFlow:

diff = y_pred - y_true
diff = tf.Print(diff, [tf.shape(diff)])
return K.square(diff)

обратите внимание, что это работает только для промежуточное значение. Keras ожидает, что тензоры, передаваемые другим слоям, будут иметь определенные атрибуты, такие как _keras_shape. Значения, обрабатываемые бэкэндом, т. е. через Print, как правило, не имеют этого атрибута. Чтобы решить эту проблему, вы можете обернуть операторы отладки в Lambda слой к примеру.