multi-label-classification

基于tf.keras,实现多标签分类CNN模型。

如何使用

快速上手

  1. run.py同目录下新建 logs文件夹,存放日志文件;训练完毕会出现models文件夹,存放模型;
  2. 查看configs.py并进行修改,此为参数配置文件;
  3. 实际用自己的数据训练时,可能需要执行以下utils/check_label_file.py,确保标签文件中的图片真实可用;
  4. 执行python run.py,会根据配置文件configs.py进行训练/测试/模型转换等。

学习掌握

  1. 先看README.md;
  2. 再看1_learning_note下的note;
  3. multi_label下的trainer.py里的__init__函数,把整体模型串起来;
  4. run.py文件,结合着看configs.py

目录结构

算法说明

多标签多分类模型基础上,添加功能:

缓解过拟合/标注错误/样本错误(稍微按效果分先后,按实际数据来)

  1. 一定程度提高BN层中gamma的L2权重衰减,conv层的L2权重衰减可以维持不变,去掉bias;[1,2,3]
  2. 加大batch,然后要用warmup(我一开始用adam+warmup,后面用radam+warmup, radam中用动态学习率);[4,5,6]
  3. 白化预处理;
  4. 修改网络结构,resnext18相比resnet18多了结构正则的作用,效果好些;
  5. 剪枝,其实和修改网络结构一个道理,只不过剪枝可以类似NAS自动找到更好的sub-network(网络结构);[3,9,10]
  6. GHM损失函数;[8]
  7. 数据增强(增加数据量);
  8. label smoothing:;[7]

TIPS:其他试过但基本无效的手段包括: 继续加大weight decay权重,BN层的gamma不加weight decay,BN层的beta加weight decay, 全连接层加dropout,focal loss,从Adam训练改为SGDM,加warmup。

[1] L2 Regularization versus Batch and Weight Normalization
[2] Towards Understanding Regularization in Batch Normalization
[3] Learning Efficient Convolutional Networks through Network Slimming
[4] Accurate, Large Minibatch SGD:Training ImageNet in 1 Hour
[5] Large Batch Training of Convolutional Networks
[6] On the Variance of the Adaptive Learning Rate and Beyond
[7] Rethinking the inception architecture for computer vision
[8] Gradient Harmonized Single-stage Detector
[9] Data-Driven Sparse Structure Selection for Deep Neural Networks
[10] Rethinking the Value of Network Pruning

TODO

  1. 解决类别不平衡的做法:
    • reweighted sample从而实现self-balance(参考sklearn);
    • 先用训练一个网络然后采样平衡数据集做finetune。
  2. 使用GAN生成数据,进行数据增强;
  3. Handwriting Recognition in Low-resource Scripts Using Adversarial Learning。