2017-02-14 15 views
7

Piszę niestandardowy cel, aby wyszkolić Keras (z modelem backend tensorflow), ale muszę debugować niektóre obliczenia pośrednie. Dla uproszczenia załóżmy, że mam:Debugowania keras warstwa pośrednia lub zmienne obiektywne z tensorflow

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

nie mogłem znaleźć łatwy sposób na dostęp, na przykład, zmienna pośrednia diff lub jej kształt podczas treningu. W tym prostym przykładzie wiem, że mogę zwrócić diff, aby wydrukować jego wartości, ale moja rzeczywista strata jest bardziej złożona i nie mogę zwrócić wartości pośrednich bez kompilacji błędów.

Czy istnieje prosty sposób na debugowanie zmiennych pośrednich w Keras?

Odpowiedz

5

To nie jest coś, co jest rozwiązane w Keras, o ile wiem, więc musisz uciekać się do funkcji specyficznej dla backendu. Obydwa węzły są węzłami identyfikującymi (tj. Zwracają węzeł wejściowy) i mają efekt uboczny drukowania wejścia (lub tensora wejścia).

Przykład Theano:

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

Przykład TensorFlow:

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

Należy zauważyć, że to jedynie dla wartości pośrednich. Keras oczekuje, że tensory przekazywane do innych warstw mają określone atrybuty, takie jak _keras_shape. Wartości przetwarzane przez backend, tj. Przez Print, zwykle nie mają tego atrybutu. Aby rozwiązać ten problem, można na przykład zawijać instrukcje debugowania w warstwie Lambda.

+3

Aby dodać do @nemo, Keras ma te funkcje drukowania backendu rozszerzone na keras przez 'K.print_tensor()' https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py# L934 i https://github.com/fchollet/keras/blob/master/keras/backend/tensorflow_backend.py#L1896. Nie próbowałem używać funkcji 'print_tensor()', ale jak @nemo zauważyłem, musisz użyć jej z warstwą 'Lambda' – indraforyou

+1

O tak, zapomniałem, że to istnieje. Ale to nie pomaga, jeśli chcesz czegoś innego niż kompletna reprezentacja tensora, np. kształt. – nemo

+1

Dzięki, ale zarówno tf.Print, jak i K.print_tensor nie wydają się niczego drukować samodzielnie i jeśli zawijam je stdoutowym drukiem Pythona, tj. Print (tf.Print (diff, [tf.shape (diff)])) jest wykonywany tylko raz podczas fazy kompilacji modelu, a nie podczas fazy uruchamiania (podczas treningu). – gcswoosh