web-dev-qa-db-ja.com

Kerasのカスタム損失関数

私は、特徴抽出器としてCNNを使用し、分類するための完全に接続されたブロックを使用して、イメージクラスインクリメンタル分類子アプローチに取り組んでいます。

最初に、新しいタスクを実行するために、トレーニングされたVGGごとにVGGを微調整しました。ネットが新しいタスクのために訓練されると、新しいクラスが利用可能になったときに忘れないようにするために、すべてのクラスのいくつかの例を保存します。

いくつかのクラスが利用可能な場合、新しいクラスの見本を含む見本のすべての出力を計算する必要があります。今、古いクラスの出力にゼロを追加し、新しいクラスの出力に各新しいクラスに対応するラベルを追加します私は私の新しいラベルを持っています、つまり:3つの新しいクラスが入ったら...

古いクラスタイプの出力:[0.1, 0.05, 0.79, ..., 0 0 0]

新しいクラスタイプの出力:[0.1, 0.09, 0.3, 0.4, ..., 1 0 0] **最後の出力はクラスに対応します。

私の質問は、新しいクラスのトレーニングのためにカスタム関数の損失関数をどのように変更できますか?私が実装したい損失関数は次のように定義されます:

loss function

ここで、蒸留損失は、古いクラスの忘却を避けるための出力に対応し、分類損失は新しいクラスに対応します。

ケラスの損失関数を変更するコードのサンプルを提供していただければ、嬉しいです。

ありがとう!!!!!

36
Eric

あなたがしなければならないのは、計算のためにkerasバックエンド関数を使用して、そのための関数を定義することです。関数は、真の値とモデルの予測値を取得する必要があります。

ここで、関数のg、q、x、yが何なのかわからないので、ここで基本的な例を作成しますが、それが何を意味するのか、それが実際の有用な関数であるかどうかは気にしません:

import keras.backend as K

def customLoss(yTrue,yPred):
    return K.sum(K.log(yTrue) - K.log(yPred))

すべてのバックエンド関数はここで見ることができます: https://keras.io/backend/#backend-functions

その後、通常の関数の代わりにその関数を使用してモデルをコンパイルします。

model.compile(loss=customLoss, optimizer = .....)
61
Daniel Möller