arcface-pytorch
arcface-pytorch copied to clipboard
How can I use arcface for classification task?
ArcMarginProduct中存在可学习的参数,如果我想将arcface用于分类任务,应该如何使用ArcMarginProduct?
同学,解决问题了没?
@shaqing 没有,我自己尝试改法的无法收敛。
我改了,怎么提示TypeError: forward() takes 2 positional arguments but 3 were given这个呢?
我QQ1215975652,想请教下你.
@LJXLJXLJX ,请问如果将这个损失用在分类任务中,在测试阶段,没有label标签,output = (one_hot * phi) + ((1.0 - one_hot) * cosine),我是将phi送入softmax激活函数中,还是cosine送入softmax激活函数中,还是其他的?
@qiny1012 直接取cosine的最大值作为预测结果, cosine是测试样本的特征向量和类别特征向量的相似度,最像的就是预测结果。或者取训练集的特征向量中心作为类别特征向量也行吧。我在cifar10上精度89.8%,比正常交叉熵损失训练掉3个点吧。
我已经用这份代码做完了一个分类任务,没理解错的话ArcMarginProduct类本质上就是一个全连接层,就像原码里那样,将model的输出再送进metric_fc层就好了,做人脸的分类还是其他的分类都一样。
同学请问解决了吗 我跟你一样 无法收敛 valid-acc 只能达到90%,而我在softmax中能达到99%以上。 test-top1只有30-40% 而softmax中能达到90%以上
有人有进展吗,我也是发现loss一直下不去
@qiny1012 直接取cosine的最大值作为预测结果, cosine是测试样本的特征向量和类别特征向量的相似度,最像的就是预测结果。或者取训练集的特征向量中心作为类别特征向量也行吧。我在cifar10上精度89.8%,比正常交叉熵损失训练掉3个点吧。
请问类别特征向量如何获取呢?
同学请问解决了吗 我跟你一样 无法收敛 valid-acc 只能达到90%,而我在softmax中能达到99%以上。 test-top1只有30-40% 而softmax中能达到90%以上
我在自己的数据上测试也遇到了同样的问题,测试准确率只能在40%左右,请问您解决这个问题了吗~
本人使用amsoftmax以及arcface的损失函数在分类任务上取得了高于softmax的分类效果(音频分类任务中)。分享给大家,希望有所帮助。
具体的做法:
# 在模型最后一层定义一个恒等变换,该层会将输入直接输出
class myNet(nn.Module):
def __init__(self):
super(myNet, self).__init__()
...
self.fc = nn.Identity()
def forward(self, x):
...
x = self.fc(x)
return x
## 训练过程中在网络后面加入损失函数
net = myNet()
loss_fn = AAMsoftmax(...)
outputs = net(src)
loss, pred = loss_fn(outputs,label)
##在测试过程中将损失函数的权重赋值到一个线性层中
net.fc = nn.Linear(...).cuda()
net.fc.weight.copy_(loss_fn.weight) ## amsoftmax和arcface中的权重w
output = net(src) ## 分类结果的输出
总结,amsoftmax和arcface想要进行分类任务,在测试或验证阶段将添加一个权重w相同的线性层即可。
本人使用amsoftmax以及arcface的损失函数在分类任务上取得了高于softmax的分类效果(音频分类任务中)。分享给大家,希望有所帮助。
具体的做法:
# 在模型最后一层定义一个恒等变换,该层会将输入直接输出 class myNet(nn.Module): def __init__(self): super(myNet, self).__init__() ... self.fc = nn.Identity() def forward(self, x): ... x = self.fc(x) return x ## 训练过程中在网络后面加入损失函数 net = myNet() loss_fn = AAMsoftmax(...) outputs = net(src) loss, pred = loss_fn(outputs,label) ##在测试过程中将损失函数的权重赋值到一个线性层中 net.fc = nn.Linear(...).cuda() net.fc.weight.copy_(loss_fn.weight) ## amsoftmax和arcface中的权重w output = net(src) ## 分类结果的输出总结,amsoftmax和arcface想要进行分类任务,在测试或验证阶段将添加一个权重w相同的线性层即可。
谢谢~请问您可以share这部分的代码嘛?
我的也是不收敛,用的是CeleBa数据集,1万个分类,请教大神们,你们训练大数据集的时候,m和s超参多少啊?代码默认是m=0.5和s=30,不过我看了原始论文,他推荐是m=1.35,大概是77度。另外,论文里没有推荐半径s的值。这2个超参大家在训练过程中,如何把握的呢?请教 :https://github.com/piginzoo/arcface-pytorch.git
对于那些不收敛的情况,可以试着先用softmax进行预训练,等模型获得较好的参数之后,再将softmax换成arcface loss。
我修改了一下,目前已经收敛了, 用了resnet的avg层,减少了点参数;m=1.2,s=64;easy_margin = True(夹角超过180度,CosFace 代替 ArcFace),训练大概10个小时,1万个分类,train acc接近到1。跟大家分享一下。代码:https://github.com/piginzoo/arcface-pytorch