2017-02-14 6 views
7

Keras(テンソルフローバックエンド付き)モデルをトレーニングするためのカスタム目的を書いていますが、中間計算をデバッグする必要があります。簡単にするために、のは、私が持っているとしましょう:ケラス中間層またはテンソルを使った目的変数のデバッグ

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

私はトレーニング中に、例えば、中間変数diffやその形状にアクセスするための簡単な方法を見つけることができませんでした。この単純な例では、値を出力するためにdiffを返すことができますが、実際の損失はより複雑で、エラーをコンパイルせずに中間値を返すことはできません。

Kerasの中間変数を簡単にデバッグする方法はありますか?

答えて

5

これは私が知る限りKerasで解決されるものではないため、バックエンド固有の機能に頼らざるを得ません。 TheanoTensorFlowはどちらも、同一性ノードである(すなわち、入力ノードを返す)Printのノードを持ち、入力(または入力のテンソル)を印刷するという副作用があります。 Theanoため

例:TensorFlowため

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

例:

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

なお、中間値は、この唯一の作品。 Kerasは、他のレイヤに渡されるテンソルが_keras_shapeのような特定の属性を持つことを期待しています。バックエンドによって処理された値、つまりPrintには、通常その属性がありません。これを解決するには、例えば、Lambda層にデバッグ文をラップすることができます。

+3

@nemoに追加するために、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 print(tf.Print(diff、[tf.shape(diff)]))実行時(訓練中)ではなく、モデルコンパイルフェーズ中に1回だけ実行されます。 – gcswoosh

関連する問題