前言:
现在需要用到tensorflow+keras,有一些遇到的问题在此记录,内容随时更新可能会非常杂乱,也许会整理。
交叉熵损失函数
直接调用compile使用自定义的加权交叉熵损失函数作为loss时,keras接收的是一个batch_size大小的tensor对象,因此在初用时遇到定义时没问题但fit时compile收到报错:Incompatible shapes: [100,1] vs. [159999,1](这里我的batch_size是100,样本个数159999也即自定义的损失函数输出了一个159999维的向量,这里应该要让损失函数的输出维度等于1——即计算这159999个数的均值再输出,然后模型会将batch_size个均值以向量形式一次输出作为一个epoch的损失)。
接下来又发现,直接用tf.keras.losses.binary_crossentropy()是可以的,即:
def my_loss(y_true, y_pred):
return keras.losses.binary_crossentropy(y_true,y_pred)*lamda
正常运行(其中lamda是全局变量)
发现网上大家普遍有两种调用交叉熵损失函数的方法,用到了两个不同的keras定义的交叉熵损失函数:
- tf.keras.losses.binary_crossentropy()
- tf.keras.backend.binary_crossentropy()
tf.keras.losses.binary_crossentropy()是通过调用tf.keras.backend.binary_crossentropy()来工作的,以下为官方文档提供的源码说明中的关键部分:源码地址
即可以理解为:
from keras import backend as K tf.keras.losses.binary_crossentropy(): return K.mean( K.binary_crossentropy() )
而backend.binary_crossentropy()的完整计算过程为:(红框为关键部分)
可以发现计算公式为:(公式图片来源知乎(懒得自己写了))



