问题描述:
人脸识别ArcFace无法正常作为loss函数使用。
Model0Zoo的研究网络中有个人脸识别的ArcFace方法。在使用的时候,可能是我操作问题无法正常使用。
【操作步骤&问题现象】
1、定义resnet50的网络,19分类。
net = resnet50(19)
2、自己定义一个loss类。步骤是先将网络输出与标签输入到ArcFace中,然后再将ArcFace的结果输入到SoftMaxCE中,将SoftMaxCE的结果作为loss值返回。
class ArcFaceLoss(LossBase):
def __init__(self, s=30.0, m=0.5):
super(ArcFaceLoss, self).__init__()
self.margin_softmax = ArcFace(world_size=0)
self.loss = SoftMaxCE(world_size=0)
def construct(self, logits, labels):
logits = self.margin_softmax(logits, labels)
return self.loss(logits, labels)
# loss函数实例化
loss = ArcFaceLoss(0)
3、优化器选择
optimizer = nn.Adam(params=net.trainable_params(), learning_rate=0.001)
4、实例化模型
model = Model(net, loss, optimizer=optimizer, metrics={"Accuracy":nn.Accuracy()})
5、模型训练
model.train(config["epochs"],
train_ds,
callbacks=[eval_cb, TimeMonitor()],
dataset_sink_mode=config["dataset_sink_mode"])
6、训练的过程中就出现不正常的返回
----------
Epoch 1/200
----------
train Loss: [-266.57397]
val Acc: 0.05357142857142857
epoch time: 28326.837 ms, per step time: 1770.427 ms
之后训练继续epoch,但train Loss和val Acc一直不变。
我不知道自己操作哪里有问题,希望有大佬能够帮助解答下疑问。
解答:
定义的网络在求margin_softmax 和 loss 之前没有实现108-110的逻辑,可以的参考mindspore/models仓的代码去实现。
https://gitee.com/mindspore/models/tree/master/research/cv/arcface