在 Keras 中使用 Tensorflow Huber 损失
Using Tensorflow Huber loss in Keras
我正在尝试在 keras 模型中使用 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
我正在查看keras的损失。显然 logcosh 具有与 huber loss 相同的属性。更多的相似度可以看here.
我带着完全相同的问题来到这里。接受的答案使用 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))
根据你是想减少损失还是损失的均值,使用上面相应的函数。
您可以将 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)
...
)
怎么样:
loss=tf.keras.losses.Huber(delta=100.0)
我正在尝试在 keras 模型中使用 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
我正在查看keras的损失。显然 logcosh 具有与 huber loss 相同的属性。更多的相似度可以看here.
我带着完全相同的问题来到这里。接受的答案使用 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))
根据你是想减少损失还是损失的均值,使用上面相应的函数。
您可以将 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)
...
)
怎么样:
loss=tf.keras.losses.Huber(delta=100.0)