我正在研究一种图像类增量分类器方法,使用CNN作为特征提取器和一个完全连接的块进行分类.
首先,我对每个训练有素的VGG网络进行了微调,以完成一项新任务.一旦网络被训练用于新任务,我就为每个班级存储一些示例,以避免在新班级可用时忘记.
当某些类可用时,我必须计算样本的每个输出,包括新类的示例.现在为旧类的输出添加零,并在新类输出上添加与每个新类对应的标签,我有新标签,即:如果有3个新类输入....
旧班类型输出: [0.1, 0.05, 0.79, ..., 0 0 0]
新类类型输出:[0.1, 0.09, 0.3, 0.4, ..., 1 0 0]**最后的输出对应于类.
我的问题是,我如何改变自定义的损失函数来训练新的类?我想要实现的损失函数定义为:
蒸馏损失对应于旧类别的输出以避免遗忘,而分类损失对应于新类别.
如果你能给我一些代码样本来改变keras中的损失函数会很好.
谢谢!!!!!
computer-vision deep-learning conv-neural-network keras loss-function
我想向输出层添加新节点以便稍后对其进行训练,我正在这样做:
def add_outputs(self, n_new_outputs):
out = self.model.get_layer('fc8').output
last_layer = self.model.get_layer('fc7').output
out2 = Dense(n_new_outputs, activation='softmax', name='fc9')(last_layer)
output = merge([out, out2], mode='concat')
self.model = Model(input=self.model.input, output=output)
Run Code Online (Sandbox Code Playgroud)
其中'fc7'是输出层之前的全连接层'fc8'。我希望只有最后一层,out = self.model.get_layer('fc8').output但输出是所有模型。有没有办法只从网络中获取一层?也许还有其他更简单的方法可以做到这一点......
谢谢!!!!
我正在尝试加载与之一起保存的模型: model.save('myModel.h5')
该模型的定义如下:
self.model = VGGFace(input_tensor=input_tensor, include_top=True)
for layer in self.model.layers:
layer.trainable = False
self.model.get_layer('fc7').trainable = True
last_layer = self.model.get_layer('fc7').output
out = BatchNormalization()(last_layer)
out = Dense(self.n_outputs, activation='softmax', name='fc8')(out)
self.model = Model(input=self.model.input, output=out)
Run Code Online (Sandbox Code Playgroud)
当我尝试加载myModel.h5时model.load_model('myModel.h5')会引发以下错误:
AttributeError: 'Model' object has no attribute 'load_model'
Run Code Online (Sandbox Code Playgroud)
我认为这是因为我不使用Sequential模型。
那我该如何加载我的模型?由于model.save('myModel.h5')似乎工作。
谢谢!!!!