keras中文文档笔记15——面向小数据集构建图像分类模型
来源:互联网 发布:npt内螺纹软件 编辑:程序博客网 时间:2024/05/22 12:53
对数据科学家而言,我们应该有能够榨取少量数据的全部价值的能力,而不是简单的伸手要更多的数据。
针对小数据集的深度学习
我经常听到的一种说法是,深度学习只有在你拥有海量数据时才有意义。虽然这种说法并不是完全不对,但却具有较强的误导性。当然,深度学习强调从数据中自动学习特征的能力,没有足够的训练样本,这几乎是不可能的。尤其是当输入的数据维度很高(如图片)时。然而,卷积神经网络作为深度学习的支柱,被设计为针对“感知”问题最好的模型之一(如图像分类问题),即使只有很少的数据,网络也能把特征学的不错。针对小数据集的神经网络依然能够得到合理的结果,并不需要任何手工的特征工程。一言以蔽之,卷积神经网络大法好!
另一方面,深度学习模型天然就具有可重用的特性:比方说,你可以把一个在大规模数据上训练好的图像分类或语音识别的模型重用在另一个很不一样的问题上,而只需要做有限的一点改动。尤其在计算机视觉领域,许多预训练的模型现在都被公开下载,并被重用在其他问题上以提升在小数据集上的性能。
数据预处理与数据提升
为了尽量利用我们有限的训练数据,我们将通过一系列随机变换堆数据进行提升,这样我们的模型将看不到任何两张完全相同的图片,这有利于我们抑制过拟合,使得模型的泛化能力更好。
在Keras中,这个步骤可以通过keras.preprocessing.image.ImageGenerator来实现。
在小数据集上训练神经网络:40行代码达到80%的准确率
进行图像分类的正确工具是卷积网络,所以我们来试试用卷积神经网络搭建一个初级的模型。因为我们的样本数很少,所以我们应该对过拟合的问题多加注意。当一个模型从很少的样本中学习到不能推广到新数据的模式时,我们称为出现了过拟合的问题。过拟合发生时,模型试图使用不相关的特征来进行预测。例如,你有三张伐木工人的照片,有三张水手的照片。六张照片中只有一个伐木工人戴了帽子,如果你认为戴帽子是能将伐木工人与水手区别开的特征,那么此时你就是一个差劲的分类器。
数据提升是对抗过拟合问题的一个武器,但还不够,因为提升过的数据仍然是高度相关的。对抗过拟合的你应该主要关注的是模型的“熵容量”——模型允许存储的信息量。能够存储更多信息的模型能够利用更多的特征取得更好的性能,但也有存储不相关特征的风险。另一方面,只能存储少量信息的模型会将存储的特征主要集中在真正相关的特征上,并有更好的泛化性能。
有很多不同的方法来调整模型的“熵容量”,常见的一种选择是调整模型的参数数目,即模型的层数和每层的规模。另一种方法是对权重进行正则化约束,如L1或L2.这种约束会使模型的权重偏向较小的值。
在我们的模型里,我们使用了很小的卷积网络,只有很少的几层,每层的滤波器数目也不多。再加上数据提升和Dropout,就差不多了。Dropout通过防止一层看到两次完全一样的模式来防止过拟合,相当于也是一种数据提升的方法。(你可以说dropout和数据提升都在随机扰乱数据的相关性)
使用预训练网络的bottleneck特征:一分钟达到90%的正确率
一个稍微讲究一点的办法是,利用在大规模数据集上预训练好的网络。这样的网络在多数的计算机视觉问题上都能取得不错的特征,利用这样的特征可以让我们获得更高的准确率。
在预训练的网络上fine-tune
为了进一步提高之前的结果,我们可以试着fine-tune网络的后面几层。Fine-tune以一个预训练好的网络为基础,在新的数据集上重新训练一小部分权重。
注意:
- 为了进行fine-tune,所有的层都应该以训练好的权重为初始值,例如,你不能将随机初始的全连接放在预训练的卷积层之上,这是因为由随机权重产生的大梯度将会破坏卷积层预训练的权重。在我们的情形中,这就是为什么我们首先训练顶层分类器,然后再基于它进行fine-tune的原因。
- 我们选择只fine-tune最后的卷积块,而不是整个网络,这是为了防止过拟合。整个网络具有巨大的熵容量,因此具有很高的过拟合倾向。由底层卷积模块学习到的特征更加一般,更加不具有抽象性,因此我们要保持前两个卷积块(学习一般特征)不动,只fine-tune后面的卷积块(学习特别的特征)。
- fine-tune应该在很低的学习率下进行,通常使用SGD优化而不是其他自适应学习率的优化算法,如RMSProp。这是为了保证更新的幅度保持在较低的程度,以免毁坏预训练的特征。
通过下面的方法你可以达到95%以上的正确率:
- 更加强烈的数据提升
- 更加强烈的dropout
- 使用L1和L2正则项(也称为权重衰减)
- fine-tune更多的卷积块(配合更大的正则)
- keras中文文档笔记15——面向小数据集构建图像分类模型
- 面向小数据集构建图像分类模型
- 面向小数据集构建图像分类模型
- 使用Keras面向小数据集进行图像分类
- keras中文文档笔记7——序贯模型
- keras中文文档笔记8——函数式模型
- keras中文文档笔记10——数据预处理
- keras面向小数据集的图像分类(VGG-16基础上fine-tune)实现(附代码)
- keras中文文档笔记9——关于keras层
- keras中文文档笔记12——协助使用Keras
- keras 构建CNN进行小样本集图像分类
- keras中文文档笔记1——概述
- keras中文文档笔记2——一些基本概念
- keras中文文档笔记3——常见问题与解答
- keras中文文档笔记4——配置与安装
- keras中文文档笔记5——快速开始
- keras中文文档笔记6——使用陷阱
- keras中文文档笔记11——网络配置
- poj 1149 PIGS 最大流模型
- 插入排序之希尔排序
- 图解快速排序
- 腾讯安全部门-大数据挑战赛-learner队伍(进入复赛)
- RILD
- keras中文文档笔记15——面向小数据集构建图像分类模型
- Servlet回顾总结
- C语言中的关键字
- Linux系统基本操作与命令-1
- node基础【02】异步编程01
- Jobdu1457 非常可乐(BFS)
- 最大连续子序列
- sequence list 线性表
- 今天开通博客,打算开始自己的学习之旅,加油,共勉!!