私の質問は、次のようなものがある場合です。
model = Model(inputs = input, outputs = [y1,y2])
l1 = 0.5
l2 = 0.3
model.compile(loss = [loss1,loss2], loss_weights = [l1,l2], ...)
最終的な損失を得るためにケラスは損失をどう扱いますか?それは次のようなものですか?
final_loss = l1*loss1 + l2*loss2
また、トレーニング中はどういう意味ですか? loss2は、y2が由来するレイヤーの重みを更新するためにのみ使用されますか?または、すべてのモデルのレイヤーに使用されていますか?
私はかなり混乱しています
loss:文字列(目的関数の名前)または目的関数。損失を参照してください。モデルに複数の出力がある場合、辞書または損失のリストを渡すことにより、各出力で異なる損失を使用できます。モデルによって最小化される損失値は、すべての個々の損失の合計になります。
...
loss_weights:異なるモデル出力の損失寄与に重み付けするスカラー係数(Pythonフロート)を指定するオプションのリストまたは辞書。モデルによって最小化される損失値は、
loss_weights
係数で重み付けされた個々のすべての損失の加重和になります。リストの場合、モデルの出力への1:1マッピングが期待されます。テンソルの場合、出力名(文字列)をスカラー係数にマップすることが期待されます。
したがって、はい、最終的な損失は「loss_weights
係数で重み付けされた、個々の損失すべての加重和」になります。
損失が計算されるコード を確認できます。
また、トレーニング中はどういう意味ですか? loss2は、y2が由来するレイヤーの重みを更新するためにのみ使用されますか?または、すべてのモデルのレイヤーに使用されていますか?
重みは backpropagation で更新されるため、各損失は入力を損失に接続するレイヤーのみに影響します。
例えば:
+----+
> C |-->loss1
/+----+
/
/
+----+ +----+/
-->| A |--->| B |\
+----+ +----+ \
\
\+----+
> D |-->loss2
+----+
loss1
はA、B、Cに影響します。loss2
はA、B、およびDに影響します。逆伝播する複数の出力については、FábioPerezが述べたものからの完全な答えではないと思います。
また、トレーニング中はどういう意味ですか? loss2は、y2が由来するレイヤーの重みを更新するためにのみ使用されますか?または、すべてのモデルのレイヤーに使用されていますか?
出力Cおよび出力Dの場合、kerasは最終損失F_loss = w1 * loss1 + w2 * loss2を計算します。そして、最終損失F_lossが出力Cと出力Dの両方に適用されます。最後に、同じF_lossを使用して逆伝搬する出力Cと出力Dからの逆伝搬が行われます。