1 pytorch
net = torch.nn.DataParallel(net).cuda()
save_model(net.module, args.save_path, '{}_{}.pth'.format(args.net, epoch))
前一行的数据并行处理,下一行出现的net.module是对应的。
2 sphereface
https://arxiv.org/abs/1704.08063
https://github.com/clcarwin/sphereface_pytorch
人脸识别代码
训练不收敛的问题,是因为学习率太低了。
训练参数最终改成了:
#!/usr/bin/env sh
set -e
export CUDA_VISIBLE_DEVICES=0
python3 ./tool/train.py\
--dataset ./data/casia_landmark2.txt\
--save_path ./model2/ \
--lr 0.1 \
--bs 512 \
--clsnum 10575
分析,因为是从头开始训练,所有学习率不应该设置得太低。开始设置成0.1合适
失败的实验,
学习率设置0.01, 0.001均不能收敛
学习:
A-softmax 损失要优于softmax,L-softmax函数
3 过拟合和欠拟合
模型在训练数据上性能糟糕时,您的模型欠拟合。这是因为模型无法捕获输入示例 (通常称为 X) 与目标值 (通常称为 Y) 之间的关系。
当您看到模型在训练数据上表现良好但在评估数据上表现不好时,表示您的模型过度拟合。这是因为模型记住了曾看到的数据,但无法归纳为未看过的示例。
训练数据的性能欠佳可能是因为模型太简单 (输入特征表述性不够) 而无法很好地描述目标。可以通过提升模型灵活性来改进性能。要提高模型的灵活性,请尝试以下操作:
添加新的域特有特征和更多特征笛卡尔积,并更改特征处理所用的类型 (例如,增加 n 元大小)
减少使用的正则化数量
如果您的模型过度拟合训练数据,合理的做法是采取措施来降低模型的灵活性。要减少模型的灵活性,请尝试以下操作:
特征选择:考虑使用更少的特征组合,减少 n 元大小,以及减少数字属性分箱的数量。
增加使用的正则化数量。
训练和测试数据的准确性可能很糟糕,因为学习算法没有足够的数据来学习。您可以通过以下操作提高性能:
增加训练数据示例的数量。
增加现有训练数据的扫描次数。
4 loss不降的问题
train loss 不断下降,test loss不断下降,说明网络仍在学习;
train loss 不断下降,test loss趋于不变,说明网络过拟合;
train loss 趋于不变,test loss不断下降,说明数据集100%有问题;
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。
4.1 loss等于87.33不变
loss等于87.33这个问题是在对Inception-V3网络不管是fine-tuning还是train的时候遇到的,无论网络迭代多少次,网络的loss一直保持恒定。
查阅相关资料以后发现是由于loss的最大值由FLT_MIN计算得到,FLT_MIN是1.17549435e−38F1.17549435e−38F其对应的自然对数正好是-87.3356,这也就对应上了loss保持87.3356了。
这说明softmax在计算的过程中得到了概率值出现了零,由于softmax是用指数函数计算的,指数函数的值都是大于0的,所以应该是计算过程中出现了float溢出的异常,也就是出现了inf,nan等异常值导致softmax输出为0.
当softmax之前的feature值过大时,由于softmax先求指数,会超出float的数据范围,成为inf。inf与其他任何数值的和都是inf,softmax在做除法时任何正常范围的数值除以inf都会变成0.然后求loss就出现了87.3356的情况。
解决办法
由于softmax输入的feature由两部分计算得到:一部分是输入数据,另一部分是各层的权值等组成
1.减小初始化权重,以使得softmax的输入feature处于一个比较小的范围
2.降低学习率,这样可以减小权重的波动范围
3.如果有BN(batch normalization)层,finetune时最好不要冻结BN的参数,否则数据分布不一致时很容易使输出值变得很大(注意将batch_norm_param中的use_global_stats设置为false )。
观察数据中是否有异常样本或异常label导致数据读取异常
4.学习率有点偏大,可以采用降低学习率,learning rate设置为0.01或者原来loss的1/51/5或者1/101/10。
4.2 loss保持0.69左右
采用VGG-16在做一个二分类问题,所以计算loss时等价与下面的公式:
loss=−log(Pk==label)loss=−log(Pk==label)
当p=0.5时,loss正好为0.693147,也就是训练过程中,无论如何调节网络都不收敛。最初的网络配置文件卷积层的参数如下所示:
从VGG-16训练好的模型进行fine-tuning也不发生改变,当在网络中加入初始化参数和decay_mult以后再次训练网络开始收敛。
但是具体是什么原因造成的,暂时还没有找到,难道是初始化参数的问题还是?
网友评论