在Keras中使用Tensorflow Huber损失

时间:2017-12-15 22:10:26

标签: python tensorflow keras reinforcement-learning

我试图在keras模型中使用huber loss(编写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

4 个答案:

答案 0 :(得分:12)

您可以在自定义Keras损失函数中包含Tensorflow的Huber损失,然后将其传递给您的模型。

    import keras
    import tensorflow as tf
    def huber_loss(y_true, y_pred):
        return tf.losses.huber_loss(y_true,y_pred)

答案 1 :(得分:6)

我带着完全相同的问题来到这里。接受的答案使用的logcosh可能具有类似的属性,但它并不完全是Huber Loss。以下是我为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))

根据您是想减少损失或损失的平均值,请使用上面的相应功能。

答案 2 :(得分:3)

我正在寻找keras的损失。 logcosh显然具有与huber loss相同的属性。可以看到here的相似性的更多细节。

答案 3 :(得分:0)

怎么样:

    loss=tf.keras.losses.Huber(delta = 100.0), optimizer=adam, metrics=['mae', root_mean_squared_log_error]
相关问题