我的任务是根据一个人的面部图像来估计一个人的年龄。
为此,我使用了 CNN,在第一阶段,我基于以下文章:DeepExpectation,它使用 VGG16 架构来预测一个人的表观年龄(其他人会投票的年龄)。我正在使用 ResNet 50 架构(并且我正在使用它的实现:ResNet Tensorflow in tensorflow)。我用于学习的数据集取自上面的同一篇文章,可以从这里下载:WIKI-IMDB dataset. 它由 523,051 张带有年龄标签的人脸图像组成,但我发现它们中的大多数都是垃圾(没有真实年龄作为标签,或者其中有多个人脸或根本没有人脸)。过滤此数据集后(通过抛出具有多张脸或根本没有脸的图像或代表年龄的标签没有意义),我的数据集中剩下大约 150k 图像。在制作这个数据集的过程中,我将图像中的所有人脸居中并将其裁剪为 224*224*3。为了增加我的数据集的大小,我水平翻转了我的数据集中的每个图像,以在我的数据集中获得总共 300k 的图像。然后我将数据集拆分为 240k 训练、30k 验证和 30k 测试图像。
我正在加载一个预训练模型(在 ImageNet 上训练),我希望得到他们在上面文章中得到的结果(以 MAE 作为评估指标,接近 3.2 年)。我还应该提到,我使用交叉熵作为损失,使用 l2 损失进行正则化,我有 101 个类作为 logits(0-100 岁)。我使用的批量大小是 64(我的 GPU 可以处理的最大值)。我尝试了几种超参数组合,但到目前为止,我在验证集上获得的最佳 MAE 是 5.8 年。
我得到的损失图示例及其超参数:
权重衰减 = 5e-4,
动量优化器,动量 = 0.9,
第一个学习率 = 0.01,每 2 个时期将其减少 10 倍,直到达到 1e-6,
即上述 LR是分配给最后一个 FC 层的 LR。对于之前的层,我使用了 0.5 个 LR。对于中间层,我使用了 LR 的 1e-2,对于第一层,我使用了 LR 的 1e-3。
我得到了以下图表:(橙色=火车,蓝色=验证)
损失:
LR:
MAE:
示例#2:
与上例相同的超参数,只是第一层和最后一个 FC 层之间的比率不同。在这个例子中,我在最后一个 FC 层中使用 0.5 的 LR 用于它之前的层,在最后一个 FC 层中使用 0.1 的 LR 用于其他层。
我得到了以下图表:(橙色=火车,蓝色=验证)
损失:
LR:
MAE:
正如您从最后两个示例中看到的那样,我很快就达到了 ~6,但似乎火车损失的优化陷入了困境,而且验证损失从某个点上也没有接近火车损失。你有什么建议吗?
另外,我对应用以下某些内容是否有益有一些想法:
- 初始化来自预训练网络的权重,直到某个层
- 初始化批处理规范旁边的预训练网络的所有权重
- 加载后冻结一些层,只训练最后一层
- 将不同的 LR 应用于不同的层(就像我在上面的示例中所做的那样)
- 我应该使用 Momentum 优化器还是 Adam Optimizer
- 如果我使用 Momentum 优化器,学习率计划应该是什么(学习率衰减)?
- 如果我使用 Adam 优化器,对不同层使用不同的学习率是否有意义?
- 权重衰减超参数应该是什么?
任何帮助将非常感激。
我不知道哪个 stackexchange 站点更适合这个问题,所以我还在 CrossValidated 上发布了这个问题:为我的 CNN 选择超参数的困难