人工智能培训

搜索

人工智能的应用:用Tensorflow进行深度学习的一些损失函数的可视化

[复制链接]
xlz888 发表于 2018-7-22 17:15:12 | 显示全部楼层 |阅读模式
xlz888 2018-7-22 17:15:12 488 0 显示全部楼层
oQeBNn4bLBAPlFCF.jpg

TensorFlow目前是数值计算的最佳开源库,它使机器学习更快更容易。在这篇文章中,您将学习机器学习中使用的一些损失函数。
损失函数在机器学习领域非常重要。它们用作测量模型预测输出Y_out与ground truth标签Y之间的距离或差异的方法,以有效地训练我们的模型。
下面是一些重要的Loss函数,它们都是使用Tensorflow库实现的。
为了了解不同的损失函数如何执行,我们将使用Matplotlib(python绘图库)对它们进行可视化。
# Import libraries
import matplotlib.pyplot as plt
import tensorflow as tf
#Start a tensorflow session
sess = tf.Session()
# Create our sample data from a line space
Y_pred = tf.linspace(-1., 1., 500)
#Create our target as a zero constant tensor
Y_truth = tf.constant(0.)
注意:我们创建自己的样本数据,仅用于可视化。在实践中,您使用了真实世界的数据和标签。
回归算法的损失函数

回归算法只是将连续数预测为输出的算法。即输出没有有限的范围。

  • L2范数损失/欧几里德损失函数
这就是预测值与真实值之间的差/距离的平方。L2范数损失是好的,因为它似乎收敛于目标。实现这一点可以使算法在接近目标时更慢地收敛,避免超过最小值。
h66RkbV76T6bObVb.jpg L2 loss function

#Calculating the L2 loss
val = tf.square(Y_truth - Y_pred)
L2_val = sess.run(val)
#ploting the predicted values against the L2 loss
Y_array = sess.run(Y_pred)
plt.plot(Y_array, L2_val, 'b-', label='L2 loss' )
plt.title('L2 loss')
plt.xlabel('$Y_{pred}$', fontsize=15)
plt.ylabel('$Y_{true}$', fontsize=15)
VlUYBrBhmufLRmm6.jpg 预测输出Y_pred与ground truth Y的关系图

注意:Tensorflow具有L2损失的内置韩式 tf.nn.l2_loss()。但Tensorflow的L2函数将结果除以2

  • L1范数损失/绝对损失函数
L1的损失和L2的损失是一样的但是我们不是取距离的平方,而是取绝对值。L1的损失在检测离群值时比L2范数更好,因为对于非常大的值来说它不是很陡。需要注意的主要一点是,当接近目标/最小值时,L1损失不是平滑的,这可能导致算法不收敛。
#Computing L1 loss with the same values
temp = tf.abs(Y_truth - Y_pred)
L1_val = sess.run(temp)
#ploting the predicted values against the L2 loss
Y_array = sess.run(Y_pred)
plt.plot(Y_array, L1_val, 'r-' )
plt.title('L1 loss')
plt.xlabel('$Y_{pred}$', fontsize=15)
plt.ylabel('$Y_{true}$', fontsize=15)
z0dNo77M25cdccN0.jpg Plot of L1 loss


  • Pseudo-Huber损失
Pseudo-Huber损失是Huber损失函数的一种变体,它通过靠近目标凸起而对于极值而言不那么陡峭,从而获得L1和L2损失的最佳特性。这种损失取决于额外的参数deltaδ,它决定了函数的陡峭程度。
McQzs7xI4ciJSCY7.jpg Pseudo Huber loss

其中a =(Y - Y _pred)
#Plot of the Pseudo-Huber loss
delta = tf.constant(0.24)
temp_ph = tf.multiply(tf.square(delta),tf.sqrt(1. + tf.square((Y_truth - Y_pred) / delta)) - 1. )
pseudo_h_vals = sess.run(temp_ph)
#ploting the predicted values against the L2 loss
Y_array = sess.run(Y_pred)
plt.plot(Y_array, pseudo_h_vals, 'g-' )
plt.title('Pseudo Huber loss')
plt.xlabel('$Y_{pred}$', fontsize=15)
plt.ylabel('$Y_{true}$', fontsize=15)
kzMM4W8Q68q8xBxW.jpg Pseudo Huber plot

分类损失函数

这些损失用于评估分类值之间的距离。

  • 交叉熵损失
交叉熵损失有时被称为逻辑损失函数。当我们预测两个0和1类时,使用二元分类的交叉熵损失。这里我们希望测量从实际类(0或1)到预测值的距离,该预测值通常是0到1之间的实数。
RXsMXBnA7ZX7kyes.jpg cross entriopy loss

#Redefining our data
Y_pred = tf.linspace(-4., 6., 500)
Y_label = tf.constant(1.)
Y_labels = tf.fill([500,], 1.)
#applying sigmoid
x_entropy_vals = - tf.multiply(Y_label, tf.log(Y_pred)) - tf.multiply((1. - Y_label), tf.log(1. - Y_pred))
x_entropy_loss = sess.run(x_entropy_vals)
#ploting the predicted values against the cross entropy loss
Y_array = sess.run(Y_pred)
plt.plot(Y_array, x_entropy_loss, 'r-' )
plt.title('Cross entropy loss')
plt.xlabel('$Y_{pred}$', fontsize=15)
plt.ylabel('$Y_{label}$', fontsize=15)
plt.ylim(-2, 5)
plt.show()
eMmA52MOBb888ZOJ.jpg Cross entropy loss


  • Sigmoid交叉熵损失
这与交叉熵损失函数非常相似,除了我们在应用交叉熵损失之前通过sigmoid函数转换x值。
我们将使用下面的tensorflow函数,其中 Logits 是我们想要应用 sigmoid函数 的张量。这通常是我们模型的预测值,而标签是ground truth值。
tf.nn.sigmoid_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
x_entropy_sigmoid_vals = tf.nn.sigmoid_cross_entropy_with_logits(labels= Y_labels, logits=Y_pred)
x_entropy_sigmoid_out = sess.run(x_entropy_sigmoid_vals)
#ploting the predicted values against the Sigmoid cross entropy loss
Y_array = sess.run(Y_pred)
plt.plot(Y_array, x_entropy_sigmoid_out, 'y-' )
plt.title('Sigmoid cross entropy loss')
plt.xlabel('$Y_{pred}$', fontsize=15)
plt.ylabel('$Y_{label}$', fontsize=15)
plt.ylim(-2, 5)
plt.show()
N9px4SFf5sDefuCd.jpg


  • 加权交叉熵损失
这是S形交叉熵损失的加权版本。在这里,我们提供积极目标的权重。即,我们指定的重量越高,正值的峰值越高。这可用于控制异常值以进行正面预测。
我们再次使用内置的Tensorflow函数来可视化
tf.nn.weighted_cross_entropy_with_logits(
targets,
logits,
pos_weight,
name = None

我们将对两个不同权重的图进行可视化,以向您展示权重如何控制峰值为正值。
#comparing two weights
weight = tf.constant(1.)
x_entropy_weighted_vals = tf.nn.weighted_cross_entropy_with_logits(targets=Y_labels, logits=Y_pred, pos_weight=weight)
x_entropy_weighted_out = sess.run(x_entropy_weighted_vals)
weight2 = tf.constant(0.5)
x_entropy_weighted_val_2 = tf.nn.weighted_cross_entropy_with_logits(targets=Y_labels, logits=Y_pred, pos_weight=weight2)
x_entropy_weighted_out_2 = sess.run(x_entropy_weighted_val_2)
#ploting the predicted values against the Sigmoid cross entropy loss
Y_array = sess.run(Y_pred)
plt.plot(Y_array, x_entropy_weighted_out, 'b-', label=' weight = 1.0' )
plt.plot(Y_array, x_entropy_weighted_out_2, 'r--', label='weight = 0.5' )
plt.title('Weighted cross entropy loss')
plt.legend(loc=4)
plt.xlabel('$Y_{pred}$', fontsize=15)
plt.ylabel('$Y_{label}$', fontsize=15)
plt.ylim(-2, 5)
plt.show()
H1nFWXyA5N11dM1B.jpg


  • Softmax交叉熵损失
当只有一个目标类别而不是多个目标类别时,此损失用于衡量损失。因此,该函数首先使用softmax函数将输出转换为概率分布,所有概率分布总和为1,然后根据真实概率分布计算损失函数。
y_pred_dist = tf.constant([[1., -3., 10.]])
target_dist = tf.constant([[0.1, 0.02, 0.88]])
softmax_xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=target_dist, logits=y_pred_dist)
print(sess.run(softmax_xentropy))
Output: [1.1601256]

  • 稀疏softmax交叉熵
这一损失与前一项相同,除了目标是概率分布,它是哪个类别为真的索引。我们只传递哪个类别为真值的索引,而不是一个值为1的稀疏全零目标向量,如下所示:
y_pred = tf.constant([[1., -3., 10.]])
sparse_target_dist = tf.constant([2]) #true value is in the second position of the sparse tensor
sparse_x_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels= sparse_target_dist, logits=y_pred)
print(sess.run(sparse_x_entropy))
Output: [0.00012564]
请记住,这些并不是机器学习中使用的所有损失函数。我只是想为你展示一些常见的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

xlz888当前离线
新手上路

查看:488 | 回复:0

快速回复 返回顶部 返回列表