8

我正在研究使用CNN作为特征提取器和完全连接的块进行分类的图像类增量分类器方法。Keras中的自定义丢失函数

首先,我对VGG每训练网络进行了微调以完成一项新任务。一旦网络接受了新任务的培训,我就会为每个班级存储一些示例,以避免在新班级可用时遗忘。

当有些类可用时,我必须计算包含新类的范例的范例的每个输出。现在添加零为老班的输出,并添加对应于每一个新类的新类输出我有我的新标签,即标签: 如果3个新的类别进入....

老班型输出: [0.1, 0.05, 0.79, ..., 0 0 0]

新类型输出:[0.1, 0.09, 0.3, 0.4, ..., 1 0 0] **最后的输出对应于类。

我的问题是,我可以如何改变一个自定义的损失函数来培训新的类? ,我想要实现的损失函数被定义为:

loss function

其中蒸馏损失对应于老的类的输出以避免遗忘,和分类损失对应于新的类。

如果你能提供我一个代码样本来改变keras中的损失函数将是很好的。

谢谢!!!!!

回答

17

您所要做的就是为此定义一个函数,使用keras后端函数进行计算。该函数必须取真实值和模型预测值。因为我不确定你的函数中g,q,x和y是什么,我只是在这里创建一个基本的例子,而不关心它是什么意思或者它是否是一个实际有用的函数:

import keras.backend as K 

def customLoss(yTrue,yPred): 
    return K.sum(K.log(yTrue) - K.log(yPred)) 

所有后端功能都可以在这里看到:https://keras.io/backend/

之后,使用该函数编译你的模型,而不是一个普通的一种:

model.compile(loss=customLoss, optimizer = .....) 
+0

okaay,这正是IW如寻找,非常感谢你! – Eric

+0

@Daniel你可以检查这个问题类似于上面,但不能如何实现是如何实现的是https://stackoverflow.com/questions/49088206/w-categorical-crossentropy-function-keras-tensorflow –