少数据量情况下深度学习模型效果的提升

数据量少的情况下,eg.450例图像

收集更多的数据

数据增强

预训练权重,即可以用迁移学习fine-turn的方法进行训练

 

效果不好的情况下有以下改进方法:

1.数据处理

数据平衡

效果不好,是因为数据量太少,采样很不平衡。

首先要标签平衡(一个batch里对阳性和阴性样本取相同数量的样本)

(另一个是loss中的平衡)

 

数据量

训练前增强,训练时增强

方法: 翻转(上下左右),旋转,亮度,色度,饱和度,变形sheer,room(某一块放大然后缩放保持图像大小不变)

相对细节不会变化

大概可以翻倍5~7倍,相当于在采样点周围变一变,增加数据,所以翻倍太多也没用,扩展不了多少维度

 

增大分错样本的数据量或权重

分错的增强属于bootstrap算法,相当于先训练弱训练器,然后增加训练集中难分类样本的比例,从而训练得到强分类器

1)分类结果和GroudTruth比较,找出错的,增大采样量

2)如果能找到分类错误和分类置信度(softmax输出的概率/预测值/分数)低的样本,eg.(0.6,0.4)是低置信度,可以增大他们的采样量,就能提升效果
 

其他(迁移学习具体应用)

如果是迁移学习,

finetune的话 一般是先把所有图片在模型上跑一边然后存下来bottleneck,即predict一下得到feature maps,存下来

然后再训练分类器的时候,没法训练时增强了,输入已经是特征了

用存好的这个特征值,可以在提取的特征向量上增加随机高斯噪声来干扰特征,相当于图像增强

 

权重可视化

便于分析模型

 

2.模型

数据量小的情况下不要使用过多参数的模型,(比如VGG,让你的一切防止过拟合的措施都白费了)

 

试很多模型,挑出好的三四个,然后融合,就是把最后一层softmax加权平均在一起

eg.xception,resnext,inception_resnet_v2

怎么加权就看模型的validation acc了

eg.错误率倒数加权

 

数据量少情况下,最后fine-tune的时候参考结构

fc+dropout+fc+softmax

(softmax前面不用加dropout,把置信度最高的都dropout就分类错误了)

数据量不足,减少一些参数,所以就用两层

fc神经元个数:一般都是二的幂次,可以512,数据量小就小一点,数据大,就1024

 

关于训练好的模型:

可以使用keras预训练模型,github有个地方可以下载,参考keras官方文档

预训练模型还是keras最全,可以用tf.keras,keras可以通过技巧和tf衔接在一起,model用keras,输入、训练还是用tf

专门有一个半官方的github,专门提供keras各种模型权重下载,载入模型,选择imagenet,它会自动下载了

 

3.小方法

采样平衡

对阳性和阴性样本取相同数量的样本,即标签平衡

(主要还是靠标签平衡)

 

更改loss function

相当于平衡不同样本的分类难易度

1)focal loss

主要是靠标签平衡,focal loss不能替代标签平衡

acc极限99.9以上的时候,推动小数点后三位的

FL的参数 alpha=0.5, gamma=2

 

视觉分类任务中处理不平衡问题的loss比较:

https://blog.csdn.net/weixin_35653315/article/details/78327408

 

2)boost思想,每次改进错分样本的权重

见上面的介绍

 

不同的优化算法

使用不同的优化算法可以使模型收敛或者加速收敛

        train_step = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(loss_mean)  
        train_step = tf.train.Optimizer(LEARNING_RATE, 0.9)
        train_step = tf.train.ProximalAdagradOptimizer(LEARNING_RATE).minimize(loss_mean)  
        train_step = tf.train.ProximalGradientDescentOptimizer(LEARNING_RATE).minimize(loss_mean)  
        train_step = tf.train.SyncReplicasOptimizer(LEARNING_RATE).minimize(loss_mean)  
        train_step = tf.train.AdamOptimizer(learning_rate=LEARNING_RATE, epsilon=1e-08).minimize(loss_mean)   
        train_step = tf.train.AdagradientOptimizer(learning_rate=LEARNING_RATE)  
        train_step = tf.train.AdamOptimizer(0.00005).minimize(loss_mean)
        train_step = tf.train.MomentumOptimizer(LEARNING_RATE, 0.9).minimize(loss_mean)
        train_step = tf.train.RMSPropOptimizer(0.0001,0.9).minimize(loss_mean)

cv论文里一般用adam

顶级论文多用SGD+momentum

 

 

4.调整超参

尽可能训练好一些的结果,也可以选择好的训练结果

(不同的step的acc差的很多,可以选用validation最高的step,可以挑最好的step进行平均)

 

lr的选择:指数衰减

decay step和decay rate自己算,保证训练最后lr减小到初始值的百分之一到千分之一

最简单的就是decay step=数据量/batch_size

eg.lr=tf.train.exponential_decay(0.0001,global_step,5,0.96,staircase=True)

 

解决过拟合的方法:

l2正则化

dropout(一般来说0.4-0.5,但数据太少,就要高一些。数据量少时drop rate高一些也行,不够还可以到0.65,再高就不好了)

earlystop

batch normlization(BN不要加在fc上)

 

4.推断

一张图增强为多张图,多个模型联合推断,然后加权

一张图,增强成若干张图,通过三个模型,得到一堆概率值

你可能感兴趣的:(深度学习)