tf.keras之损失函数

2020-03-18  本文已影响0人  612twilight

tf.keras里面有许多内置的损失函数可以使用,由于种类众多,以几个常用的为例:

BinaryCrossentropy

BinaryCrossentropy是用来进行二元分类交叉熵损失函数的,共有如下几个参数

如果输入的from_logits是true,那么首先就要经过激活函数的处理。那对于一个[batch_size,num_class]的logits,进行sigmoid激活就是对将tensor中的每个元素x转为sigmoid(x).构成矩阵P,P_{ij}代表的就是样本i属于标签j概率,即:
p_{ij}=\frac{1}{1+e^{-x_{ij}}}
然后在这个基础上计算二分类的交叉熵,这里的二分类交叉熵是tensor中的每个元素都独立的,所以会有[batch_size,num_class]个loss,以下y表示真实的标签
loss_{ij}=-(1-y_{ij})*log(1-p_{ij})-y_{ij}*log(p_{ij})
然后在axis=-1维度做了reduce_mean操作,变成了[batch_size]维度的loss,最后再经过reduction里面指定的处理方法,再对batch求一次平均值。另外,这个方法如果在from_logits=True的情况下,可以用tf.nn.sigmoid_cross_entropy_with_logits来代替,阅读源码,在tf.keras里面就是调的这个函数,sigmoid_cross_entropy_with_logits返回的是[batch_size]个loss,最后我们再接一个reduce_mean就可以变成标量了。

CategoricalCrossentropy

CategoricalCrossentropy是用来处理多分类的,同样有以上这几个参数。但是激活函数不一样,使用的是softmax激活函数,softmax的过程如下
p_{ij}=\frac {e^{x_{ij}}}{\sum_{j=0}^{J}e^{x_{ij}}}
经过激活函数之后,每一行的元素代表了这个样本属于各类别的概率,并且概率和为1,即[batch_size,num_class]里面的每一行的和为1,然后进行交叉熵计算,这里和binary_cross_entropy不同,这里中间计算出来的loss的shape只有[batch_size]了。多分类是二分类的扩展,二分类可以看成两个互斥的标签,而多分类则是多个互斥的标签
loss_{i}:=-\sum_{j=0}^{J}(y_{ij}log(p_{ij}))

SparseCategoricalCrossentropy

SparseCategoricalCrossentropy损失函数同CategoricalCrossentropy类似,只是输入不一样,该损失函数的输入的y_true是[batch_size]个标签,每个元素是label对应的index,没有经过one-hot编码,这个方法如果在from_logits=True的情况下,和tf.nn.sparse_sigmoid_cross_entropy_with_logits再接一个reduce_mean是类似的效果。

MeanSquaredError

MeanSquaredError损失函数(均方差)一般用来解决回归问题,参数只有两个,默认即可。

均方差就是y_pred语y_true对应元素的差的平方,然后求和在求平均

不同问题的最后一层激活函数与损失函数

问题类型 最后一层激活函数 损失函数
二分类 sigmoid binary_crossentropy
多类别、单标签 softmax categorical_crossentropy
多类别、多标签 sigmoid binary_crossentropy
回归到任务任意 mse
回归到0~1之间的值 sigmoid mse或者binary_crossentropy
上一篇下一篇

猜你喜欢

热点阅读