2017-02-14 19 views
7

Я пишу пользовательскую задачу для обучения модели Keras (с тензорным потоком), но мне нужно отлаживать некоторые промежуточные вычисления. Для простоты предположим, что у меня есть:Отладка промежуточного слоя или объектных переменных keras с тензорным потоком

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

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

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

ответ

5

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

Пример Теано:

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.

+3

Чтобы добавить к @nemo, Keras имеет эти функции бэкэнд-печати, расширенные в keras через 'K.print_tensor()' https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py# L934 & https://github.com/fchollet/keras/blob/master/keras/backend/tensorflow_backend.py#L1896. Я не пробовал использовать функцию print_tensor() ', но как @nemo отметил, что вы должны использовать его с слоем« Lambda » – indraforyou

+1

О да, забыл, что это существовало. Но это не поможет вам, если вы хотите нечто иное, чем полное строковое представление тензора, например. форма. – nemo

+1

Спасибо, но оба tf.Print и K.print_tensor, кажется, ничего не печатают сами по себе, и если я их обертываю печатью python stdout, то есть print (tf.Print (diff, [tf.shape (diff)])) он выполняется только один раз во время фазы компиляции модели, а не во время фазы запуска (во время обучения) – gcswoosh