web-dev-qa-db-ja.com

Kerasカスタム損失関数:現在の入力パターンへのアクセス

Keras(Tensorflowバックエンドを使用)では、現在の入力パターンをカスタム損失関数で使用できますか?

現在の入力パターンは、予測を生成するために使用される入力ベクトルとして定義されます。たとえば、次のことを考慮してください:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, shuffle=False)。次に、現在の入力パターンは、y_train(損失関数ではy_trueと呼ばれます)に関連付けられた現在のX_trainベクトルです。

カスタム損失関数を設計するとき、現在の予測だけでなく、現在の入力パターンへのアクセスを必要とする値を最適化/最小化するつもりです。

私は一通り見てきました https://github.com/fchollet/keras/blob/master/keras/losses.py

また、「 y_pred、y_trueだけではないコスト関数

カスタマイズされた損失関数を生成する前の例にも精通しています。

import keras.backend as K

def customLoss(y_true,y_pred):
    return K.sum(K.log(y_true) - K.log(y_pred))

おそらく(y_true,y_pred)は他の場所で定義されています。私は成功せずにソースコードを調べましたが、現在の入力パターンを自分で定義する必要があるのか​​、それとも既に損失関数にアクセスできるのか疑問に思っています。

15
jtromans

損失関数を内部関数としてラップして、それに入力テンソルを渡すことができます(通常、追加の引数を損失関数に渡すときに行われます)。

_def custom_loss_wrapper(input_tensor):
    def custom_loss(y_true, y_pred):
        return K.binary_crossentropy(y_true, y_pred) + K.mean(input_tensor)
    return custom_loss

input_tensor = Input(shape=(10,))
hidden = Dense(100, activation='relu')(input_tensor)
out = Dense(1, activation='sigmoid')(hidden)
model = Model(input_tensor, out)
model.compile(loss=custom_loss_wrapper(input_tensor), optimizer='adam')
_

異なるXがモデルに渡されると、_input_tensor_と損失値(主にK.mean(input_tensor)部分)が変化することを確認できます。

_X = np.random.Rand(1000, 10)
y = np.random.randint(2, size=1000)
model.test_on_batch(X, y)  # => 1.1974642

X *= 1000
model.test_on_batch(X, y)  # => 511.15466
_
23
Yu-Yang