(原)CosFace/AM-Softmax及其mxnet代码
转载请注明出处:
http://www.cnblogs.com/darkknightzh/p/8525241.html
论文:
CosFace: Large Margin Cosine Loss for Deep Face Recognition
https://arxiv.org/abs/1801.09414
Additive Margin Softmax for Face Verification
https://arxiv.org/abs/1801.05599
第一篇论文目前无代码
第二篇论文官方代码:
https://github.com/happynear/AMSoftmax
这两篇论文第三方mxnet代码:
https://github.com/deepinsight/insightface
说明:没用过mxnet,下面的代码注释只是纯粹从代码的角度来分析并进行注释,如有错误之处,敬请谅解,并欢迎指出。
先查看sphereface,查看$\psi (\theta )$的介绍:http://www.cnblogs.com/darkknightzh/p/8524937.html
论文AM中定义$\psi (\theta )$为:
$\psi (\theta )=\cos (\theta )-m$
sphereface中只对w进行归一化,AM中对w及x均进行了归一化,不过为了使得训练能收敛,增加了一个参数s=30,最终AM如下:
${{L}_{AMS}}=-\frac{1}{n}\sum\limits_{i=1}^{n}{\log \frac{{{e}^{s\centerdot (\cos {{\theta }_{yi}}-m)}}}{{{e}^{s\centerdot (\cos {{\theta }_{yi}}-m)}}+\sum\nolimits_{j=1,j\ne yi}^{c}{{{e}^{s\centerdot \cos {{\theta }_{j}}}}}}}=-\frac{1}{n}\sum\limits_{i=1}^{n}{\log \frac{{{e}^{s\centerdot (W_{yi}^{T}{{f}_{i}}-m)}}}{{{e}^{s\centerdot (W_{yi}^{T}{{f}_{i}}-m)}}+\sum\nolimits_{j=1,j\ne yi}^{c}{{{e}^{sW_{j}^{T}{{f}_{i}}}}}}}$
程序中计算时,$s\centerdot (\cos {{\theta }_{yi}}-m)=s\centerdot \cos {{\theta }_{yi}}-sm$,分别计算$s\centerdot \cos {{\theta }_{yi}}$,sm。而后将yi处的减去sm,之后通过log softmax,得到概率,在计算损失。
具体的代码如下(完整代码请见参考网址中mxnet的代码):
1 s = args.margin_s # 参数s 2 m = args.margin_m # 参数m 3 _weight = mx.symbol.Variable("fc7_weight", shape=(args.num_classes, args.emb_size), lr_mult=1.0) # (C,F) 4 _weight = mx.symbol.L2Normalization(_weight, mode='instance') # 对w进行归一化 5 6 nembedding = mx.symbol.L2Normalization(embedding, mode='instance', name='fc1n')*s # 对x进行归一化,并得到s*x,(B,F) 7 fc7 = mx.sym.FullyConnected(data=nembedding, weight = _weight, no_bias = True, num_hidden=args.num_classes, name='fc7') # Y=XW'+b,(B,F)*(C,F)'=(B,C), '为转置 8 9 s_m = s*m # 计算s*m 10 gt_one_hot = mx.sym.one_hot(gt_label, depth = args.num_classes, on_value = s_m, off_value = 0.0) # 得到one-hot矩阵,每行对应i处值为s_m 11 fc7 = fc7-gt_one_hot # 将对应i处的减去s_m
posted on 2018-03-07 20:49 darkknightzh 阅读(5725) 评论(0) 编辑 收藏 举报