web-dev-qa-db-ja.com

Kerasの複数出力:カスタム損失関数

ケラスでマルチ出力モデルを使用しています

model1 = Model(input=x, output=[y2,y3])

model1.compile((optimizer='sgd', loss=cutom_loss_function)

私のcustom_loss_functionは;

def custom_loss(y_true, y_pred):
   y2_pred = y_pred[0]
   y2_true = y_true[0]

   loss = K.mean(K.square(y2_true - y2_pred), axis=-1)
   return loss

出力y2でのみネットワークをトレーニングします。

複数の出力が使用される場合の損失関数のy_predおよびy_true引数の形状/構造は何ですか?上記のようにアクセスできますか? y_pred[0]またはy_pred[:,0]ですか?

16
shaaa

出力y2でネットワークをトレーニングしたいだけです。

Keras機能APIガイド に基づいて、あなたはそれを達成することができます

model1 = Model(input=x, output=[y2,y3])   
model1.compile(optimizer='sgd', loss=custom_loss_function,
                  loss_weights=[1., 0.0])

複数の出力が使用される場合の損失関数のy_predおよびy_true引数の形状/構造は何ですか?上記のようにアクセスできますか? y_pred [0]またはy_pred [:、0]

ケラスのマルチ出力モデルでは、損失関数は各出力に個別に適用されます。擬似コード内:

loss = sum( [ loss_function( output_true, output_pred ) for ( output_true, output_pred ) in Zip( outputs_data, outputs_model ) ] )

複数の出力で損失機能を実行する機能は利用できないようです。損失機能をネットワークのレイヤーとして組み込むことで、おそらくそれを達成できます。

16
Sharapolas

シャラポラスの答えは正しい。

ただし、モデルの複数の出力の複雑な相互依存関係を持つカスタム損失関数を構築するためにレイヤーを使用するよりも優れた方法があります。

私が実際に使用していることがわかっている方法は、_model.compile_を呼び出さず、model._make_predict_function()のみを呼び出すことです。そこから、_model.output_を呼び出して、カスタムオプティマイザーメソッドをビルドできます。これにより、すべての出力[y2、y3]が得られます。それを使って魔法をかけるときは、_keras.optimizer_を取得し、model.trainable_weightsと損失を使用してget_updateメソッドを使用します。最後に、必要な入力のリスト(_keras.function_のみ)とoptimizer.get_update呼び出しから取得した更新を含む_model.input_を返します。この関数は、model.fitを置き換えます。

上記は、A3CやPPOなどのPolicyGradientアルゴリズムでよく使用されます。ここに私が説明しようとしたものの例があります: https://github.com/Hyeokreal/Actor-Critic-Continuous-Keras/blob/master/a2c_continuous.py build_modelおよびcritic_optimizerのメソッドを見て、何が起こるかを理解するためにkreas.backend.functionドキュメントを読んでください。

この方法では、セッション管理に頻繁に問題があることがわかり、現在tf-2.0ケラではまったく機能していないようです。したがって、メソッドを知っている人がいたら教えてください。私は1つを探してここに来ました:)

0
Nric