Edd*_*ddy 6 loss neural-network tensorflow
确切地说,我正在寻找的损失函数是当绝对误差小于0.5时的平方误差,并且当绝对误差大于0.5时它是绝对误差本身.这样,误差函数的梯度不超过1,因为一旦平方误差函数的梯度达到1,绝对误差函数就会启动,并且梯度保持恒定为1.我已经将我当前的实现包含在下面.出于某种原因,它给我的性能不仅仅是平方误差.
fn_choice_maker1 = (tf.to_int32(tf.sign(y - y_ + 0.5)) + 1)/2
fn_choice_maker2 = (tf.to_int32(tf.sign(y_ - y + 0.5)) + 1)/2
choice_maker_sqr = tf.to_float(tf.mul(fn_choice_maker1, fn_choice_maker2))
sqr_contrib = tf.mul(choice_maker_sqr, tf.square(y - y_))
abs_contrib = tf.abs(y - y_)-0.25 - tf.mul(choice_maker_sqr, tf.abs(y - y_)-0.25)
loss = tf.reduce_mean(sqr_contrib + abs_contrib)
train_step = tf.train.AdamOptimizer(1e-4).minimize(loss)
Run Code Online (Sandbox Code Playgroud)
choice_maker_sqr是一个列张量,只要误差介于0.5和-0.5之间就是一个.这些名字非常自我解释.
这是我在python tensorflow中实现的Huber损失函数:
def huber_loss(y_true, y_pred, max_grad=1.):
"""Calculates the huber loss.
Parameters
----------
y_true: np.array, tf.Tensor
Target value.
y_pred: np.array, tf.Tensor
Predicted value.
max_grad: float, optional
Positive floating point value. Represents the maximum possible
gradient magnitude.
Returns
-------
tf.Tensor
The huber loss.
"""
err = tf.abs(y_true - y_pred, name='abs')
mg = tf.constant(max_grad, name='max_grad')
lin = mg*(err-.5*mg)
quad=.5*err*err
return tf.where(err < mg, quad, lin)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3595 次 |
| 最近记录: |