web-dev-qa-db-ja.com

Kerasテンソル値のデバッグ

独自のケラス損失機能を実装しています。テンソル値にアクセスするにはどうすればよいですか?

私が試したこと

def loss_fn(y_true, y_pred):
    print y_true

印刷する

Tensor("target:0", shape=(?, ?), dtype=float32)

y_true値にアクセスするkeras関数はありますか?

21
ronroo

Kerasのバックエンドにはprint_tensorこれにより、これを行うことができます。この方法で使用できます:

import keras.backend as K

def loss_fn(y_true, y_pred):
    y_true = K.print_tensor(y_true, message='y_true = ')
    y_pred = K.print_tensor(y_pred, message='y_pred = ')
    ...

関数は同一のテンソルを返します。そのテンソルが評価されると、messageが前に付いたコンテンツを出力します。 Keras docs から:

Print_tensorは、次のコードで使用されるxと同じ新しいテンソルを返すことに注意してください。そうしないと、評価中に印刷操作が考慮されません。

そのため、後でテンソルを使用するようにしてください。

14
nroulet

通常、_y_true_事前に知っています-列車コーパスの準備中...

ただし、_y_true_および/または_y_pred_内の値を確認するには、1つのトリックがあります。 Kerasは、ニューラルネットワークの出力を印刷するために、それぞれ callback を書く機会を与えてくれます。次のようになります。

_def loss_fn(y_true, y_pred):
    return y_true # or y_pred
...
import keras.callbacks as cbks
class CustomMetrics(cbks.Callback):

    def on_Epoch_end(self, Epoch, logs=None):
        for k in logs:
            if k.endswith('loss_fn'):
               print logs[k]
_

ここで、_loss_fn_は、モデルのコンパイル中にmodel.compile(...,metrics=[loss_fn],)関数に渡すときの損失関数の名前です。

したがって、最後に、このCustomMetricsコールバックを引数としてmodel.fit()に渡す必要があります。

_model.fit(x=train_X, y=train_Y, ... , callbacks=[CustomMetrics()])
_

PS:ここKerasのようにTheano(またはTensorFlow)を使用する場合、pythonプログラムを作成し、それをコンパイルして実行します。したがって、例では_y_true_-はコンパイルと損失関数のカウントに使用されるテンソル変数。

それは、その中の値を見る方法がないことを意味します。たとえば、Theanoでは、それぞれのeval()関数の実行後、いわゆる共有変数のみを見ることができます。詳細については、 この質問 を参照してください。

5
Igor Poletaev

TensorFlowのkerasを使用している場合は、 Eager Execution を有効にできます。

import tensorflow as tf 
tf.enable_eager_execution()

その後、損失関数のテンソルを印刷できます。

「ValueError:TFネイティブオプティマイザーのみがEagerモードでサポートされています」というエラーメッセージが表示される場合。そして、例えば「adam」をオプティマイザーとして使用した場合、モデルのコンパイル引数を次のように変更できます。

model.compile(optimizer = tf.train.AdamOptimizer(), loss = loss_fn, ...)
1
F1refly

損失関数を再定義して、代わりに値を返すことができます。

_def loss_fn(y_true, y_pred):
    return y_true
_

いくつかのテンソルを作成しましょう:

_from keras import backend as K

a = K.constant([1,2,3])
b = K.constant([4,5,6])
_

keras.backend.eval() APIを使用して、損失関数を評価します。

_loss = loss_fn(a,b)
K.eval(loss)
# array([1., 2., 3.], dtype=float32)
_
1
Raimi bin Karim

私が使う

print("y_true = " + str(y_true.eval()))

デバッグ用。

1
Peter Svehla

テンソルシンボリック変数から直接値を取得することはできません。値を抽出するためにtheano関数を記述する必要があります。 Keanoのバックエンドとしてtheanoを選択することを忘れないでください。

ノートブックのリンクをチェックして、基本的なtheano変数と関数を取得します: 自分のレイヤーの呼び出し関数でテンソル値を取得します

0