Keras 面向小数据集的图像分类(vgg)笔记

本文详细介绍了如何利用Keras的VGG16模型进行小数据集图像分类,包括从原始网络提取bottleneck特征、微调预训练网络的高层、设置合适的批大小和使用Flatten层。通过实际操作,展示了在有限的数据上构建高效分类器的方法,并探讨了避免过拟合的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要是在进行利用vgg16网络进行迁移学习过程当中遇到的一些问题,以及解决办法,有很多大牛的博客给我不少的帮助和思路,在此表示感谢。以下问参考文献以及链接
keras面向小数据集的图像分类(VGG-16基础上fine-tune)实现
vgg16 fine-tune代码实现
keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
Building powerful image classification models using very little data
Visualization of the filters of VGG16, via gradient ascent in input space.
How convolutional neural networks see the world
在本文中,将使用VGG-16模型提供一种面向小数据集(几百张到几千张图片)构造高效、实用的图像分类器的方法并给出试验结果。

本文将探讨如下几种方法:

  1. 从图片中直接训练一个小网络(作为基准方法)
  2. 利用预训练网络的bottleneck(瓶颈)特征
  3. fine-tune预训练网络的高层

本文需要使用的Keras模块有:

fit_generator:用于从Python生成器中训练网络

ImageDataGenerator:用于实时数据提升

层参数冻结和模型fine-tune

这份数据集来源于Kaggle,猫狗大战,可以使用百度网盘下载。原数据集有12500只猫和12500只狗,我们只取了各个类的前1000张图片。另外我们还从各个类中取了400张额外图片用于测试。
图片的数量非常少,这对于图像分类来说是个大麻烦。但现实是,很多真实世界图片获取是很困难的,我们能得到的样本数目确实很有限(比如医学图像,每张正样本都意味着一个承受痛苦的病人。对数据科学家而言,我们应该有能够榨取少量数据的全部价值的能力,而不是简单的伸手要更多的数据。

经常听到的一种说法是,深度学习只有在你拥有海量数据时才有意义。虽然这种说法并不是完全不对,但却具有较强的误导性。当然,深度学习强调从数据中自动学习特征的能力,没有足够的训练样本,这几乎是不可能的。尤其是当输入的数据维度很高(如图片)时。然而,卷积神经网络作为深度学习的支柱,被设计为针对“感知”问题最好的模型之一(如图像分类问题),即使只有很少的数据,网络也能把特征学的不错。针对小数据集的神经网络依然能够得到合理的结果,并不需要任何手工的特征工程。一言以蔽之,卷积神经网络大法好!

尤其在计算机视觉领域,许多预训练的模型现在都被公开下载,并被重用在其他问题上以提升在小数据集上的性能。另一方面,深度学习模型天然就具有可重用的特性:比方说,你可以把一个在大规模数据上训练好的图像分类或语音识别的模型重用在另一个很不一样的问题上,而只需要做有限的一点改动。
nb_train_samples = 2000
nb_val_samples = 800
batch_size = 16#之前设置的是128,但是128 不能被8002000整除。原作者设置的是16,是OK的。

这里写图片描述
这部分代码为保存bottleneck features的步骤。

  1. 载入图片;
  2. 灌入pre-model的权重;
  3. 得到bottleneck feature
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import keras
from keras.models import Sequential
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值