Отладка промежуточного слоя 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
слой к примеру.