浅笑の博客

我们的征途是星辰大海


  • 首页

  • 标签29

  • 分类6

  • 归档47

  • 留言板

  • 搜索

TensorFlow学习笔记4:损失函数

发表于 2019-08-06 分类于 深度学习 , Python Valine: 本文字数: 2.4k

损失函数

损失函数(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的交叉熵算法上,正样本算出的值乘以某个系数。

TensorFlow
TensorFlow学习笔记3:激励函数
TensoeFlow学习笔记5:线性回归
Zheng Yujie

Zheng Yujie

C++/Python/深度学习
47 日志
6 分类
29 标签
目录
  1. 1. 损失函数
  2. 2. 使用损失函数
  3. 3. TensorFlow的Cross_Entropy实现
© 2019 Zheng Yujie | 全站共199k字
浙ICP备 - 19035016号
0%