TensorFlow学习笔记4:损失函数
损失函数
损失函数(loss function)是机器学习中非常重要的内容,它是度量模型输出值与目标值的差异,也就是作为评估模型效果的一种重要指标,损失函数越小,表明模型的鲁棒性就越好。
使用损失函数
在TensorFlow中训练模型时,通过损失函数告诉TensorFlow预测结果相比目标结果是好还是坏。在多种情况下,我们会给出模型训练的样本数据和目标数据,损失函数即是比较预测值与给定的目标值之间的差异。
下面将介绍在TensorFlow中常用的损失函数。
L1正则损失函数(即绝对值损失函数)
TensorFlow实现:
1
loss_L1_vals = tf.abs(y_pred-y_target)
L2正则损失函数(即欧拉损失函数)
L2正则损失函数是预测值与目标值差值的平方和,公式如下:TensorFlow实现:
1
loss_L2_vals = tf.square(y_pred-y_target)
均方误差(MSE,mean squared error)
对L2取平均值就变成了均方误差,公式如下:TensorFlow实现:
1
loss_mse_vals = tf.reduce.mean(tf.square(y_pred-y_target))
交叉熵(Cross Entropy)损失函数
交叉熵刻画了两个概率分布之间的距离,是分类问题中使用广泛的损失函数。给定两个概率分布p和q,交叉熵刻画的是两个概率分布之间的距离,公式如下:TensorFlow实现:
1
2# 注意y_pred需要先经过softmax处理
cross_entropy = -tf.reduce_mean(y_target*tf.log(tf.clip_by_value(y_pred,1e-10,1.0)))tf.clip_by_value()函数可将一个tensor的元素数值限制在指定范围内,这样可防止一些错误运算,起到数值检查作用。
TensorFlow的Cross_Entropy实现
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, dim=-1, name=None)
该函数的功能是自动计算logits(未经过Softmax)与labels之间的cross_entropy交叉熵。该操作应该施加在未经过Softmax处理的logits上,否则会产生错误结果;labels为期望输出,且必须采用labels=y_,logits=y3的形式将参数传入。
第一个参数logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是num_classes
第二个参数labels:实际的标签,大小同上。
注意: 这个函数的返回值并不是一个数,而是一个向量,如果要求交叉熵,我们要再做一步tf.reduce_sum操作,就是对向量里面所有元素求和,最后才得到交叉熵,如果求loss,则要做一步tf.reduce_mean操作,对向量求均值!tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)
该函数与tf.nn.softmax_cross_entropy_with_logits()十分相似,唯一的区别在于labels,该函数的标签labels要求是排他性的即只有一个正确类别,labels的形状要求是[batch_size] 而值必须是从0开始编码的int32或int64,而且值范围是[0, num_class),对比于tf.nn.softmax_cross_entropy_with_logits的[batchsize,num_classes]格式的得分编码。tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)
sigmoid_cross_entropy_with_logits是TensorFlow最早实现的交叉熵算法。这个函数的输入是logits和labels,logits就是神经网络模型中的 W * X矩阵,注意不需要经过sigmoid,而labels的shape和logits相同,就是正确的标签值,例如这个模型一次要判断100张图是否包含10种动物,这两个输入的shape都是[100, 10]。注释中还提到这10个分类之间是独立的、不要求是互斥,这种问题我们称为多目标(多标签)分类,例如判断图片中是否包含10种动物中的一种或几种,标签值可以包含多个1或0个1。tf.nn.weighted_cross_entropy_with_logits(targets, logits, pos_weight, name=None)
weighted_sigmoid_cross_entropy_with_logits是sigmoid_cross_entropy_with_logits的拓展版,多支持一个pos_weight参数,在传统基于sigmoid的交叉熵算法上,正样本算出的值乘以某个系数。