Closed functionlinx closed 3 years ago
用softmax训练就正常,看来必须得先用softmax预训练一下才行。
casia
数据集我也没试过,在 MS1M
数据集上直接用 arcface loss
训练应该是可以的,这里 loss-function-test-on-mobilenet 的记录就是直接用 arcface loss
训练的
data.py
的 cache
位置有问题,可能会让 shuffle
失效,可以注释掉 75,76
行试试random_status=0
,指定不添加数据的随机变换试试softmax
之后再用 arcface
训练有收敛吗?如果曲线跟我的类似的话,应该是需要先 softmax
了cosine learning rate decay
,我还没有测试过
tt = train.Train(data_path, save_path='keras_mobile_facenet_emore.h5', eval_paths=eval_paths, basic_model=basic_model, lr_base=0.001, decay_type='cos', lr_decay=100, lr_min=1e-6, batch_size=768, random_status=0)
casia
数据集我也没试过,在MS1M
数据集上直接用arcface loss
训练应该是可以的,这里 loss-function-test-on-mobilenet 的记录就是直接用arcface loss
训练的
- 最近刚刚发现我的
data.py
的cache
位置有问题,可能会让shuffle
失效,可以注释掉75,76
行试试- 可以使用
random_status=0
,指定不添加数据的随机变换试试- 另外,在
softmax
之后再用arcface
训练有收敛吗?如果曲线跟我的类似的话,应该是需要先softmax
了- 另外,在可以正常收敛之后,可以试试
cosine learning rate decay
,我还没有测试过tt = train.Train(data_path, save_path='keras_mobile_facenet_emore.h5', eval_paths=eval_paths, basic_model=basic_model, lr_base=0.001, decay_type='cos', lr_decay=100, lr_min=1e-6, batch_size=768, random_status=0)
arcface loss 不限制y_pred的输入,训练的时候可能会出现nan,梯度的分母等于0,用softmax预训练倒是没出现过,不过我自己还是加上去了。
y_pred_vals=tf.keras.backend.clip(y_pred_vals,-1.0 + tf.keras.backend.epsilon(),1.0 - tf.keras.backend.epsilon())
原文里面还有提到weight_decay,应该是训练一段时间了再加上去会好点吧。
nan
的问题我也遇到过,我之前是直接加了 assert
,理论上不应该出现,可能跟 NormDense
的权重初始化值有关系,后来就没有再遇到过,tf.assert_equal
以及 tf.clip_by_value
就注释掉了weight_decay
我还没对比过,目前我主要在验证一些模型,效果来看是
se_mobilefacenet
> mobilefacenet
> mobilenet
resnest_101
> resnet101
Efficientnet
比较不好训练,尝试过几个,还没有好的效果ms1m
上用 mobilenet
+ arcface loss
又跑了一下试试,还是先用 softmax
再转到 arcface
吧,前期还是 softmax
收敛快些,而且还可以验证下模型结构或者数据有没有问题cosine lr decay
训练,看起来似乎能有点效果我用casia跑resnet50,用softmax收敛正常,在测试集也正常,转到arcface之后,训练正常收敛,但是在测试集效果不正常,agedb只有0.5,lfw0.6。不知道为什么会这样.....
batch size
多大的?arcface
训练的 loss
与 accuracy
到达了多少?softmax
转到 arcface
的时候有没有单独的 bottleneckOnly
训练?arcface loss
的问题,Resnet50
的训练我也跑过,会比 Resnet101
差点,但不至于测试集 0.5
NormDense
层我的实现类似于 gluon-face 中的实现arcface loss
我试过很多不同的实现, Arcface loss 这里第一个图是原版 MXNet
的转换效果,第二个图的是我现在用的batch size 256,lr_base 0.001
train: loss: 9.3808 - accuracy: 0.9566 test: lfw evaluation max accuracy: 0.972833
没有使用bottleneckOnly 训练,可能是因为这个。我先用softmax训练20epoch,lfw测试大概0.96,再直接用arcface loss跑5个epoch之后,lfw测试0.98,继续跑25个epoch,lfw下降到了0.97。
应该不是loss 的问题。
我最近刚刚下载了 casia
数据集,跑了下测试,训练了两个 Resnet50 模型,一个 batach_size=512,一个 batch_size=256,区别不大
我最近刚刚下载了
casia
数据集,跑了下测试,训练了两个 Resnet50 模型,一个 batach_size=512,一个 batch_size=256,区别不大
- 这个数据集太小了,不太好有比较好的泛化效果
- Arcface loss 训练正常,loss 下降比较快,但从验证集效果看,跟验证集的数据差别比较大
这个数据集和别的相比确实小,我主要是想实现一下能不能接近论文的结果。 我和你曲线差不多,换为acrface loss 之后agedb验证集会涨2个点然后就开始下降,个人觉得是学习率的问题,我现在在尝试调整学习率。 泛化的问题,我觉得加上weight decay会有一定程度的改善。
我训练时候调整了学习率,使用的是 lr_decay=0.001
,下降的太慢了,在 epoch=80 的时候是 0.0009333,对比训练 ms1m
的时候 lr_decay=0.05
在 epoch=80 的时候是 3.01974e-05。。。降低下学习率应该会收敛快一点
我发现一个问题,dataset zoo 里面的数据集图像是经过mtcnn aligned过的嘛,我看论文里面都有这一步处理。
我最近测试了一些其他的方式,使用 keras
可以复现原版 mxnet
的结果,刚刚发现原版 mxnet
中的 resnet
是不一样的。。
稍等我上传一下
关于你说的这个问题我也再看看
我已经上传了,可以参照一下 训练结果 dataset zoo 里面的数据集图像应该都是已经对齐的
I would like to close this, as it's solved.
我看论文里面用casia训练结果很好,可是我自己用casia试了下,不管是resnet还是mobilenet都很差劲。