tf.keras之损失函数
tf.keras里面有许多内置的损失函数可以使用,由于种类众多,以几个常用的为例:
BinaryCrossentropy
BinaryCrossentropy是用来进行二元分类交叉熵损失函数的,共有如下几个参数
-
from_logits=False, 指出进行交叉熵计算时,输入的y_pred是否是logits,logits就是没有经过sigmoid激活函数的fully connect的输出,如果在fully connect层之后经过了激活函数sigmoid的处理,那这个参数就可以设置为False
-
label_smoothing=0, 是否要进行标签平滑,这里是防止过拟合的一个技巧
-
reduction=losses_utils.ReductionV2.AUTO,对于多标签分类的情况,正常计算完之后,loss会batch_size维的向量,这个参数是进行最后的求平均,如果是设置为losses_utils.ReductionV2.None,就不会求平均了
-
name='binary_crossentropy'。
如果输入的from_logits是true,那么首先就要经过激活函数的处理。那对于一个[batch_size,num_class]的logits,进行sigmoid激活就是对将tensor中的每个元素x转为sigmoid(x).构成矩阵P,代表的就是样本i属于标签j概率,即:
然后在这个基础上计算二分类的交叉熵,这里的二分类交叉熵是tensor中的每个元素都独立的,所以会有[batch_size,num_class]个loss,以下表示真实的标签
然后在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的过程如下
经过激活函数之后,每一行的元素代表了这个样本属于各类别的概率,并且概率和为1,即[batch_size,num_class]里面的每一行的和为1,然后进行交叉熵计算,这里和binary_cross_entropy不同,这里中间计算出来的loss的shape只有[batch_size]了。多分类是二分类的扩展,二分类可以看成两个互斥的标签,而多分类则是多个互斥的标签
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损失函数(均方差)一般用来解决回归问题,参数只有两个,默认即可。
-
reduction=losses_utils.ReductionV2.AUTO,
-
name='mean_squared_error'
均方差就是y_pred语y_true对应元素的差的平方,然后求和在求平均
不同问题的最后一层激活函数与损失函数
问题类型 | 最后一层激活函数 | 损失函数 |
---|---|---|
二分类 | sigmoid | binary_crossentropy |
多类别、单标签 | softmax | categorical_crossentropy |
多类别、多标签 | sigmoid | binary_crossentropy |
回归到任务任意 | 无 | mse |
回归到0~1之间的值 | sigmoid | mse或者binary_crossentropy |