arcface-pytorch icon indicating copy to clipboard operation
arcface-pytorch copied to clipboard

How can I use arcface for classification task?

Open LJXLJXLJX opened this issue 5 years ago • 16 comments

ArcMarginProduct中存在可学习的参数,如果我想将arcface用于分类任务,应该如何使用ArcMarginProduct?

LJXLJXLJX avatar Jan 08 '20 03:01 LJXLJXLJX

同学,解决问题了没?

shaqing avatar Jan 09 '20 06:01 shaqing

@shaqing 没有,我自己尝试改法的无法收敛。

LJXLJXLJX avatar Jan 09 '20 06:01 LJXLJXLJX

我改了,怎么提示TypeError: forward() takes 2 positional arguments but 3 were given这个呢?

shaqing avatar Jan 09 '20 06:01 shaqing

我QQ1215975652,想请教下你.

shaqing avatar Jan 09 '20 06:01 shaqing

@LJXLJXLJX ,请问如果将这个损失用在分类任务中,在测试阶段,没有label标签,output = (one_hot * phi) + ((1.0 - one_hot) * cosine),我是将phi送入softmax激活函数中,还是cosine送入softmax激活函数中,还是其他的?

qiny1012 avatar Jul 23 '20 02:07 qiny1012

@qiny1012 直接取cosine的最大值作为预测结果, cosine是测试样本的特征向量和类别特征向量的相似度,最像的就是预测结果。或者取训练集的特征向量中心作为类别特征向量也行吧。我在cifar10上精度89.8%,比正常交叉熵损失训练掉3个点吧。

wangjl1993 avatar Jul 28 '20 08:07 wangjl1993

我已经用这份代码做完了一个分类任务,没理解错的话ArcMarginProduct类本质上就是一个全连接层,就像原码里那样,将model的输出再送进metric_fc层就好了,做人脸的分类还是其他的分类都一样。

Boatsure avatar Aug 28 '20 09:08 Boatsure

同学请问解决了吗 我跟你一样 无法收敛 valid-acc 只能达到90%,而我在softmax中能达到99%以上。 test-top1只有30-40% 而softmax中能达到90%以上

oliver8459 avatar Sep 03 '20 15:09 oliver8459

有人有进展吗,我也是发现loss一直下不去

ccl-private avatar Apr 20 '21 07:04 ccl-private

@qiny1012 直接取cosine的最大值作为预测结果, cosine是测试样本的特征向量和类别特征向量的相似度,最像的就是预测结果。或者取训练集的特征向量中心作为类别特征向量也行吧。我在cifar10上精度89.8%,比正常交叉熵损失训练掉3个点吧。

请问类别特征向量如何获取呢?

Yuz-nuaa avatar May 26 '21 06:05 Yuz-nuaa

同学请问解决了吗 我跟你一样 无法收敛 valid-acc 只能达到90%,而我在softmax中能达到99%以上。 test-top1只有30-40% 而softmax中能达到90%以上

我在自己的数据上测试也遇到了同样的问题,测试准确率只能在40%左右,请问您解决这个问题了吗~

EricXuziang avatar Oct 05 '21 12:10 EricXuziang

本人使用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相同的线性层即可。

qiny1012 avatar Oct 06 '21 01:10 qiny1012

本人使用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这部分的代码嘛?

EricXuziang avatar Oct 06 '21 14:10 EricXuziang

我的也是不收敛,用的是CeleBa数据集,1万个分类,请教大神们,你们训练大数据集的时候,m和s超参多少啊?代码默认是m=0.5和s=30,不过我看了原始论文,他推荐是m=1.35,大概是77度。另外,论文里没有推荐半径s的值。这2个超参大家在训练过程中,如何把握的呢?请教 :https://github.com/piginzoo/arcface-pytorch.git

piginzoo avatar Oct 11 '21 07:10 piginzoo

对于那些不收敛的情况,可以试着先用softmax进行预训练,等模型获得较好的参数之后,再将softmax换成arcface loss。

qiny1012 avatar Oct 11 '21 08:10 qiny1012

我修改了一下,目前已经收敛了, 用了resnet的avg层,减少了点参数;m=1.2,s=64;easy_margin = True(夹角超过180度,CosFace 代替 ArcFace),训练大概10个小时,1万个分类,train acc接近到1。跟大家分享一下。代码:https://github.com/piginzoo/arcface-pytorch

piginzoo avatar Oct 12 '21 07:10 piginzoo