web-dev-qa-db-ja.com

KerasでのTensorflow Huber損失の使用

ケラスモデルでフーバーロスを使用しようとしています(DQNを記述しています)が、悪い結果になっています。私のコードは以下です。

model = Sequential()
model.add(Dense(output_dim=64, activation='relu', input_dim=state_dim))
model.add(Dense(output_dim=number_of_actions, activation='linear'))
loss = tf.losses.huber_loss(delta=1.0)
model.compile(loss=loss, opt='sgd')
return model
11
hakaishinbeerus

私はまったく同じ質問でここに来ました。受け入れられた答えはlogcoshを使用しますが、これは同様の特性を持っている可能性がありますが、それは正確にはフーバー損失ではありません。 KerasにHuber Lossを実装する方法は次のとおりです(Tensorflow 1.5のKerasを使用していることに注意してください)。

import numpy as np
import tensorflow as tf

'''
 ' Huber loss.
 ' https://jaromiru.com/2017/05/27/on-using-huber-loss-in-deep-q-learning/
 ' https://en.wikipedia.org/wiki/Huber_loss
'''
def huber_loss(y_true, y_pred, clip_delta=1.0):
  error = y_true - y_pred
  cond  = tf.keras.backend.abs(error) < clip_delta

  squared_loss = 0.5 * tf.keras.backend.square(error)
  linear_loss  = clip_delta * (tf.keras.backend.abs(error) - 0.5 * clip_delta)

  return tf.where(cond, squared_loss, linear_loss)

'''
 ' Same as above but returns the mean loss.
'''
def huber_loss_mean(y_true, y_pred, clip_delta=1.0):
  return tf.keras.backend.mean(huber_loss(y_true, y_pred, clip_delta))

損失を減らすか、損失の平均を減らすかによって、上記の対応する関数を使用します。

8
avejidah

Tensorflowの tf.losses.huber_loss カスタムKeras損失関数で、モデルに渡します。

ラッパーの理由は、Kerasがy_true, y_predを損失関数に追加し、多くのパラメータのいくつかを使用してtf.losses.huber_loss。そのため、次のような何らかのクロージャーが必要になります。

def get_huber_loss_fn(**huber_loss_kwargs):

    def custom_huber_loss(y_true, y_pred):
        return tf.losses.huber_loss(y_true, y_pred, **huber_loss_kwargs)

    return custom_huber_loss

# Later...
model.compile(
    loss=get_huber_loss_fn(delta=0.1)
    ...
)
15
Chris Marciniak

私はケラスの損失を見ていました。 logcoshには、フーバー損失と同じ特性があるようです。類似性の詳細については、 こちら をご覧ください。

4
hakaishinbeerus

どうですか:

    loss=tf.keras.losses.Huber(delta=100.0)
2
Val