ケラスでマルチ出力モデルを使用しています
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]
ですか?
出力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 ) ] )
複数の出力で損失機能を実行する機能は利用できないようです。損失機能をネットワークのレイヤーとして組み込むことで、おそらくそれを達成できます。
シャラポラスの答えは正しい。
ただし、モデルの複数の出力の複雑な相互依存関係を持つカスタム損失関数を構築するためにレイヤーを使用するよりも優れた方法があります。
私が実際に使用していることがわかっている方法は、_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つを探してここに来ました:)