数据量少的情况下,eg.450例图像
收集更多的数据
数据增强
预训练权重,即可以用迁移学习fine-turn的方法进行训练
效果不好的情况下有以下改进方法:
效果不好,是因为数据量太少,采样很不平衡。
首先要标签平衡(一个batch里对阳性和阴性样本取相同数量的样本)
(另一个是loss中的平衡)
训练前增强,训练时增强
方法: 翻转(上下左右),旋转,亮度,色度,饱和度,变形sheer,room(某一块放大然后缩放保持图像大小不变)
相对细节不会变化
大概可以翻倍5~7倍,相当于在采样点周围变一变,增加数据,所以翻倍太多也没用,扩展不了多少维度
分错的增强属于bootstrap算法,相当于先训练弱训练器,然后增加训练集中难分类样本的比例,从而训练得到强分类器
1)分类结果和GroudTruth比较,找出错的,增大采样量
2)如果能找到分类错误和分类置信度(softmax输出的概率/预测值/分数)低的样本,eg.(0.6,0.4)是低置信度,可以增大他们的采样量,就能提升效果
如果是迁移学习,
finetune的话 一般是先把所有图片在模型上跑一边然后存下来bottleneck,即predict一下得到feature maps,存下来
然后再训练分类器的时候,没法训练时增强了,输入已经是特征了
用存好的这个特征值,可以在提取的特征向量上增加随机高斯噪声来干扰特征,相当于图像增强
权重可视化
便于分析模型
数据量小的情况下不要使用过多参数的模型,(比如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,它会自动下载了
对阳性和阴性样本取相同数量的样本,即标签平衡
(主要还是靠标签平衡)
相当于平衡不同样本的分类难易度
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
尽可能训练好一些的结果,也可以选择好的训练结果
(不同的step的acc差的很多,可以选用validation最高的step,可以挑最好的step进行平均)
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上)
一张图增强为多张图,多个模型联合推断,然后加权
一张图,增强成若干张图,通过三个模型,得到一堆概率值