在路缘石中使用张量流Huber损失

2024-05-20 15:27:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个keras模型中使用huber-loss(写DQN),但是我得到了坏的结果,我认为我做错了什么。我的is代码在下面。

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

Tags: 代码模型addoutputmodelisdqnactivation
3条回答

您可以将Tensorflow的^{}包装在自定义的Keras loss函数中,然后将其传递给您的模型。

包装器的原因是Keras只将y_true, y_pred传递给loss函数,您可能还想使用许多参数中的一些来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)
    ...
)

我带着同样的问题来这里。接受的答案使用logcosh,它可能具有类似的属性,但并不完全是Huber损失。下面是我如何实现Keras的Huber损失(注意,我使用的Keras来自Tensorflow 1.5)。

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))

根据您是想减少损失还是平均损失,使用上面的相应函数。

我在调查凯拉斯的损失。显然logcosh和huber损失有相同的性质。更多关于它们相似性的细节可以看到here

相关问题 更多 >