L1/L2/smooth_l1_loss/中心损失函数对比写法

一.公式与原理

L2公式:

smooth_L1公式: 

中心损失函数公式:
L1/L2/smooth_l1_loss/中心损失函数对比写法_第1张图片

其中c_yi为第yi类训练样本深度特征的均值点。

由于中心点损失函数值考虑类内差异性,而交叉熵损失函数只考虑类间差异性,一般会把中心损失函数和交叉熵损失函数配合起来用各取所长。这样网络最终的目标函数可以表示为:

三种函数numpy代码实现

import numpy as np
import matplotlib.pyplot as plt


#y = |x|
def L1():
    x = np.arange(-2, 2, 0.01)
    y = abs(x)
    plt.figure()
    plt.plot(x, y, 'b', label='l1')
    # plt.show()

#y = x^2
def L2():
    x = np.arange(-2, 2, 0.01)
    y = x**2
    plt.plot(x, y, 'g', label='l2')
    # plt.show()

#y = 0.5*x**2 |x|<=1
#y = |x|-0.5 |x|>1
def smooth_l1():
    x = np.arange(-2, 2, 0.01)
    t = abs(x)
    y = np.where(t <= 1, 0.5*t**2, t-0.5)
    plt.plot(x, y, 'r', label='smooth_l1')
    plt.legend(loc='best')
    plt.show()

if __name__ == '__main__':
    L1()
    L2()
    smooth_l1()

L1/L2/smooth_l1_loss/中心损失函数对比写法_第2张图片

可看出,L1在0点处导数不唯一,会影响收敛,smooth L1对于离群点更加鲁棒,即:相比于L2损失函数,其对离群点、异常值(outlier)不敏感,梯度变化相对更小.

二.tensorflow实现smoothL1函数

函数: 

def smooth_l1_loss(y_true, y_pred):
    """Implements Smooth-L1 loss.
    y_true and y_pred are typically: [N, 4], but could be any shape.
    """
    diff = tf.abs(y_true - y_pred)
    less_than_one = tf.cast(tf.less(diff, 1.0), "float32")
    loss = (less_than_one * 0.5 * diff**2) + (1 - less_than_one) * (diff - 0.5)
    print(loss)

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run(loss))
    return loss

你可能感兴趣的:(文献阅读,tensorflow,numpy)