独自のケラス損失機能を実装しています。テンソル値にアクセスするにはどうすればよいですか?
私が試したこと
def loss_fn(y_true, y_pred):
print y_true
印刷する
Tensor("target:0", shape=(?, ?), dtype=float32)
y_true値にアクセスするkeras関数はありますか?
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と同じ新しいテンソルを返すことに注意してください。そうしないと、評価中に印刷操作が考慮されません。
そのため、後でテンソルを使用するようにしてください。
通常、_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()
関数の実行後、いわゆる共有変数のみを見ることができます。詳細については、 この質問 を参照してください。
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, ...)
損失関数を再定義して、代わりに値を返すことができます。
_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)
_
私が使う
print("y_true = " + str(y_true.eval()))
デバッグ用。
テンソルシンボリック変数から直接値を取得することはできません。値を抽出するためにtheano関数を記述する必要があります。 Keanoのバックエンドとしてtheanoを選択することを忘れないでください。
ノートブックのリンクをチェックして、基本的なtheano変数と関数を取得します: 自分のレイヤーの呼び出し関数でテンソル値を取得します