tensorflow常用损失函数(loss function)(一):图像识别、分类

1. 图像分类

在tensorflow中针对图像分类的loss function主要三交叉熵函数,主要有这几类:softmax、sigmoid、sparse_softmax、weighted加权交叉熵。

有关sigmoid、softmax、logits、cross entropy的计算方式,在另一个博客中有介绍,博客地址:https://blog.csdn.net/itlilyer/article/details/107101569。

sigmoid_cross_entropy_with_logits

tf.nn.sigmoid_cross_entropy_with_logits(logits, targets,name=None)

参数说明:

labels: 是一个与logits有相同shape的Tensor,是图像的标签。不必是one-hot格式的。
logits: 类型是float32或者float64的Tensor,是预测值。
name: 可以为该操作设置一个名称,是可选的。
注意: labels和logits的shape必须一致。如果不一致会抛出ValueError的异常。

返回值:

与logits具有相同shape的Tensor,内容是每个类型的logistic loss值。

使用说明:

衡量分类任务中的概率误差,每个类别都是独立的,但是不互斥,可同时存在于同一张图片中。例如:一个多标签分类的任务,一张图片中可以同时包含大象和狗。

计算公式:

设 x=logits,z = labels

loss = max(x, 0) - x*z + log(1 + exp(-abs(x)))

推理过程可见tensorflow的官网:
https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

softmax_cross_entropy_with_logits

tf.nn.softmax_cross_entropy_with_logits(logits, labels,axis=-1, name=None)

参数说明:

**labels:**在类别维度上每一个向量应该都是有效的概率分布(个人理解:一个batch中每个概论值都应该大于等于0小于等于1并且,所有类别的概率和等于1),例如:一个shape为[batch_size, num_class]的labels,labels[i]的每一个元素都是有效的概率分布。
logits: 一般是网络最后一层的输出,通常是线性输出。是未进行归一化的对数分布。
axis: class所在的维度。默认是-1,最后一维。
name: 操作的名称。

返回值:

一个包含softmax交叉熵loss值的Tensor,类型与logits相同,shape等于[batch_size].

使用说明:

在分类任务中衡量概率误差(每一个对象只属于一个类型)。例如:CIFAR-10中的图片中只会有一个标签,图像可能是卡车或狗,但不能同时包含两种物体。

注意:
1、尽管图片中类别是互斥的,只能有一种类别,但是标签不是,标签只要满足一个有效的概率分布即可。如果不是一个有效的概率分布将会导致梯度计算不正确。

2、如果每个label都是互斥的,也就是满足one-hot(只有一个地方值是1,其他地方都是0),还可以使用tf.nn.sparse_softmax_cross_entropy_with_logits()。

3、给该函数传入的logits必须是没有进行缩放的(值不是一定要在0和1之间),为了提升效率会在这个函数内部会执行一次softmax的操作。所以不要将softmax的输出作为该函数的输入,会导致计算结果不正确。

4、通常情况下labels和logits的shape是[batch_size, num_classes],类型必须相同(float16、float32、float64)

sparse_softmax_cross_entropy_with_logits

tf.nn.spares_softmax_cross_entropy_with_logits(logits, labels,name=None)

参数说明:

labels: 一个shape为[d_0, d_1, …, d_{r-1}],类型是int32或者int64。一个实体的label的取值必须是在[0, num_classes)之间(也就是说label中的值是0, 1, 2, 3,4,5…这样的取值,与softmax的区别),其他值会抛出异常,并且返回NaN的无效值。
logits: 一个没有缩放的对数概率,shape为[d_0, d_1, …, d_{r-1}, num_classes],数据类型为float16、float32、float64
name: 操作的名称

返回值

shape与labels相同,类型与logits相同。

使用说明

与softmax_cross_entropy_with_logits的使用差不多,但要注意差别:
1、两个的label是不一样的,shape和类型都不一样,sparse的labels要是one-hot的

其他的使用方式与上个函数基本一致

weighted_cross_entropy_with_logits

tf.nn.weighted_cross_entropy_with_logits(logits, targets,pos_weight,name=None)

参数说明:

labels: 一个与logits类型和shape相同的Tensor
logits: 类型为float32或者float64的Tensor
pos_weight: 用在正样本上的系数

返回值:

与logits的shape相同的Tensor

使用说明:

weighted_cross_entropy_with_logits与sigmoid_cross_entropy_with_logits除了给正样本添加一个权重pos_weight以外,其他是一样的。可以通过调整正负样本的权重来权衡召回率(recall)和精度(precision)。

通常的交叉熵定义为:

labels * (-log(sigmoid(logits)) + (1 - labels) * (-log(1 - sigmoid(logits))

带权重的交叉熵定义:

labels * (-log(sigmoid(logits)) * pos_weight + (1 - labels) * (-log(1 - sigmoid(logits))

总结

可以看到这四个函数可以分为两类,sigmoid和softmax。个人理解,sigmoid的函数应用与输出结果有多种可能性的场景,比如说对于一张x光片,各种疾病的概率;sigmoid将预测值映射到0到1之间,用来作二分类;而softmax常用于多分类的情况,但是针对二分类softmax和sigmoid是一样的,因为当类别数为2的时候,softmax会退化为sigmoid。如有不正确的地方请多指正。

你可能感兴趣的:(机器学习,图像分类,机器学习,神经网络,tensorflow,深度学习)