我正在Keras上使用CNN开发图像分类器。由于图像来自多个域,我想尝试域适应。
为了同时训练图像分类器以及制作域不变的特征,我在Keras中为域丢失提供了负损失权重。
model.compile(optimizer='adam',
loss={'main_output': 'categorical_crossentropy', 'domain_output': 'categorical_crossentropy'},
loss_weights={'main_output': 1, 'domain_output': -0.1},
metrics={'main_output': 'accuracy, 'domain_output': 'accuracy'})
此处,main output
是图像分类的softmax输出,domain_output
是域分类的softmax输出(目标:域标签)。
这种实现对于域适应是否正确?
这种方法在功能上与"梯度反转层相同" ({3}}
答案 0 :(得分:2)
嗯 - 您的两个问题的回答都是肯定的(只要您有域和类预测的单独模型分支和输出)。
答案 1 :(得分:0)
我认为答案应该是: 1.是的,这是一种领域适应。 2.不,这不是该文件的实施。
这是因为对于“梯度反转层”,梯度反转发生在几个完全连接的层之前。这意味着要对这些层进行训练以区分域。如果您直接像代码中那样逆转损失,那么也会使最后一层有所分歧。基本上,您没有训练。
虽然我不确定最终结果,但我想它可能会比“梯度反转层”的原始实施情况差。