热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深度学习数据集制作_R语言基于Keras的小数据集深度学习图像分类

原文链接:http:tecdat.cn?p6714必须使用非常少的数据训练图像分类模型是一种常见情况,如果您在专业环境中进行计算机视觉,则

 原文链接:http://tecdat.cn/?p=6714

必须使用非常少的数据训练图像分类模型是一种常见情况,如果您在专业环境中进行计算机视觉,则在实践中可能会遇到这种情况。“少数”样本可以表示从几百到几万个图像的任何地方。作为一个实际例子,我们将重点放在将图像分类为狗或猫的数据集中,其中包含4,000张猫狗图片(2,000只猫,2,000只狗)。我们将使用2,000张图片进行训练- 1,000张用于验证,1,000张用于测试。

深度学习与小数据问题的相关性

您有时会听到深度学习仅在有大量数据可用时才有效。这部分是有效的:深度学习的一个基本特征是它可以自己在训练数据中找到有趣的特征,而不需要手动特征工程,这只有在有大量训练样例可用时才能实现。对于输入样本非常高维的问题(如图像)尤其如此。

 让我们从数据开始吧。

下载数据

 使用 Dogs vs. Cats数据集 。   

这里有些例子:

095d28c64c4024952dc641f673e8f7b7.png

该数据集包含25,000张狗和猫的图像(每类12,500张),543 MB  。下载并解压缩后,您将创建一个包含三个子集的新数据集:每个类包含1,000个样本的训练集,每个类500个样本的验证集,以及每个类500个样本的测试集。

以下是执行此操作的代码:

original_dataset_dir <- “〜/ Downloads / kaggle_original_data”base_dir <- “〜/ Downloads / cats_and_dogs_small”dir.create(base_dir)train_dir <- file.path(base_dir&#xff0c;“train”)dir.create(train_dir)validation_dir <- file。path(base_dir&#xff0c;“validation”)

使用预训练的convnet

在小图像数据集上深入学习的一种常见且高效的方法是使用预训练网络。一个预训练的网络是一个先前在大型数据集上训练的已保存网络&#xff0c;通常是在大规模图像分类任务上。如果这个原始数据集足够大且足够通用&#xff0c;则预训练网络学习的特征的空间层次结构可以有效地充当视觉世界的通用模型&#xff0c;因此其特征可以证明对许多不同的计算机视觉问题有用&#xff0c;甚至虽然这些新问题可能涉及与原始任务完全不同的类。 

有两种方法可以使用预训练网络&#xff1a;特征提取和微调。让我们从特征提取开始。

特征提取

特征提取包括使用先前网络学习的表示来从新样本中提取感兴趣的特征。然后&#xff0c;这些功能将通过一个新的分类器运行&#xff0c;该分类器从头开始训练。

  为什么只重用卷积基数&#xff1f;您是否可以重复使用密集连接的分类器&#xff1f;一般来说&#xff0c;应该避免这样做。原因是卷积基础学习的表示可能更通用&#xff0c;因此更具可重用性 。

注意&#xff0c;由特定卷积层提取的表示的一般性(以及因此可重用性)的级别取决于模型中的层的深度。模型中较早出现的图层会提取局部的&#xff0c;高度通用的特征贴图(例如可视边缘&#xff0c;颜色和纹理)&#xff0c;而较高层的图层会提取更抽象的概念(例如“猫耳朵”或“狗眼”) 。因此&#xff0c;如果您的新数据集与训练原始模型的数据集有很大不同&#xff0c;那么最好只使用模型的前几层来进行特征提取&#xff0c;而不是使用整个卷积基础。

让我们通过使用在ImageNet上训练的VGG16网络的卷积基础来实现这一点&#xff0c;从猫和狗图像中提取有趣的特征&#xff0c;然后在这些特征之上训练狗与猫的分类器。

让我们实例化VGG16模型。

conv_base <- application_vgg16(weights &#61;“imagenet”&#xff0c;include_top &#61; FALSE&#xff0c;input_shape &#61; c(150,150,3))

将三个参数传递给函数&#xff1a;

  • weights 指定从中初始化模型的权重。

  • include_top“密集连接”是指在网络顶部包括(或不包括)密集连接的分类器。默认情况下&#xff0c;此密集连接的分类器对应于ImageNet的1,000个类。

  • input_shape是您将提供给网络的图像张量的形状。这个参数是可选的&#xff1a;如果你不传递它&#xff0c;网络将能够处理任何大小的输入。

 它类似于你已经熟悉的简单的网络&#xff1a; 

summary(conv_base)Layer (type) Output Shape Param #&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;input_1 (InputLayer) (None, 150, 150, 3) 0________________________________________________________________block1_conv1 (Convolution2D) (None, 150, 150, 64) 1792________________________________________________________________block1_conv2 (Convolution2D) (None, 150, 150, 64) 36928________________________________________________________________block1_pool (MaxPooling2D) (None, 75, 75, 64) 0________________________________________________________________block2_conv1 (Convolution2D) (None, 75, 75, 128) 73856________________________________________________________________block2_conv2 (Convolution2D) (None, 75, 75, 128) 147584________________________________________________________________block2_pool (MaxPooling2D) (None, 37, 37, 128) 0________________________________________________________________block3_conv1 (Convolution2D) (None, 37, 37, 256) 295168________________________________________________________________block3_conv2 (Convolution2D) (None, 37, 37, 256) 590080________________________________________________________________block3_conv3 (Convolution2D) (None, 37, 37, 256) 590080________________________________________________________________block3_pool (MaxPooling2D) (None, 18, 18, 256) 0________________________________________________________________block4_conv1 (Convolution2D) (None, 18, 18, 512) 1180160________________________________________________________________block4_conv2 (Convolution2D) (None, 18, 18, 512) 2359808________________________________________________________________block4_conv3 (Convolution2D) (None, 18, 18, 512) 2359808________________________________________________________________block4_pool (MaxPooling2D) (None, 9, 9, 512) 0________________________________________________________________block5_conv1 (Convolution2D) (None, 9, 9, 512) 2359808________________________________________________________________block5_conv2 (Convolution2D) (None, 9, 9, 512) 2359808________________________________________________________________block5_conv3 (Convolution2D) (None, 9, 9, 512) 2359808________________________________________________________________block5_pool (MaxPooling2D) (None, 4, 4, 512) 0&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;Total params: 14,714,688Trainable params: 14,714,688Non-trainable params: 0

 此时&#xff0c;有两种方法可以继续&#xff1a;

  • 在数据集上运行卷积 。

  • conv_base通过在顶部添加密集层来扩展您的模型() 。

在这篇文章中&#xff0c;我们将详细介绍第二种技术 。请注意&#xff0c; 只有在您可以访问GPU时才应该尝试 。

 特征提取

由于模型的行为与图层类似&#xff0c;因此您可以像添加图层一样将模型(如conv_base)添加到顺序模型中。

model <- keras_model_sequential()&#xff05;>&#xff05;conv_base&#xff05;>&#xff05;layer_flatten()&#xff05;>&#xff05;layer_dense( &#61; 256&#xff0c;activation &#61;“relu”)&#xff05;>&#xff05;layer_dense(u its &#61; &#xff0c; “sigmoid”)

这就是模型现在的样子&#xff1a;

summary(model)Layer (type) Output Shape Param #&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;vgg16 (Model) (None, 4, 4, 512) 14714688________________________________________________________________flatten_1 (Flatten) (None, 8192) 0________________________________________________________________dense_1 (Dense) (None, 256) 2097408________________________________________________________________dense_2 (Dense) (None, 1) 257&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;Total params: 16,812,353Trainable params: 16,812,353Non-trainable params: 0

如您所见&#xff0c;VGG16的卷积基数有14,714,688个参数&#xff0c;非常大。 

在Keras中&#xff0c; 使用以下freeze_weights()函数冻结网络&#xff1a;

freeze_weights(conv_base)length(model $ trainable_weights)

 使用数据扩充

过度拟合是由于过多的样本需要学习&#xff0c;导致无法训练可以推广到新数据的模型。 

在Keras中&#xff0c;这可以通过配置对读取的图像执行的多个随机变换来完成&#xff0c;image_data_generator()。例如&#xff1a;

train_datagen &#61; image_data_generator(rescale &#61; 1/255&#xff0c; &#61; 40&#xff0c;width_shift_range &#61; 0.2&#xff0c;height_shift_range &#61; 0.2&#xff0c; &#61; 0.2&#xff0c;zoom_range &#61; 0.2&#xff0c;horizo &#61; TRUE&#xff0c;fill_mode &#61;“nearest”)

 浏览一下这段代码&#xff1a;

  • rotation_range 是一个度数(0-180)的值&#xff0c;一个随机旋转图片的范围。

  • width_shift并且height_shift是在垂直或水平方向上随机平移图片的范围。

  • shear_range 用于随机应用剪切变换。

  • zoom_range 用于随机缩放图片内部。

  • horizontal_flip 用于水平地随机翻转一半图像 - 当没有水平不对称假设时相关(例如&#xff0c;真实世界的图片)。

  • fill_mode 是用于填充新创建的像素的策略&#xff0c;可以在旋转或宽度/高度偏移后出现。

现在我们可以使用图像数据生成器训练我们的模型&#xff1a;

model&#xff05;>&#xff05;compile(loss &#61;“binary_crossentropy”&#xff0c;optimizer &#61; optimizer_rmsprop(lr &#61; 2e-5)&#xff0c;metrics &#61; c(“accuracy”))history <- model&#xff05;>&#xff05;fit_generator(train_generator&#xff0c;steps_per_epoch &#61; 100&#xff0c;

绘制结果。准确率达到约90&#xff05;。

2c627fdba1ffb2a97cbe6a989c8bba5b.png

微调

另一种广泛使用的模型重用技术&#xff0c;是对特征提取的补充&#xff0c;是微调 &#xff0c;微调网络的步骤如下&#xff1a;

  • 在已经训练过的基础网络上添加自定义网络。

  • 冻结基础网络。

  • 训练你添加的部分。

  • 解冻基础网络中的某些层。

  • 联合训练这些层和您添加的部分。

在进行特征提取时&#xff0c;您已经完成了前三个步骤。让我们继续第4步&#xff1a;您将解冻您的内容conv_base&#xff0c;然后冻结其中的各个图层。

现在您可以开始微调网络了。

model&#xff05;>&#xff05;compile(lo ropy”&#xff0c;optimizer &#61; opt imizer_rmsprop(lr &#61; 1e-5)&#xff0c;metrics &#61; c(“accuracy”))his el&#xff05;>&#xff05;fit_generator(train_ g steps_per_epoch &#61; 100&#xff0c;epochs &#61; 100 &#xff0c;validation_data &#61; validation_genera tor&#xff0c;validation_steps &#61; 50)

让我们绘制结果&#xff1a;

e6f4014dfbead5f7ca8d31ba1ffae4e6.png

·

你可以看到准确度有6&#xff05;的提升&#xff0c;从大约90&#xff05;到高于96&#xff05;。

 您现在可以最终在测试数据上评估此模型&#xff1a;

test_generator <- (test_dir&#xff0c;test_datagen&#xff0c;target_size &#61; c(150,150)&#xff0c;batch_size &#61; 20&#xff0c; &#61;“binary”)model&#xff05;>&#xff05;evaluate_generator( &#xff0c;steps &#61; 50) $ loss[1] 0.2158171$ acc[1] 0.965

在这里&#xff0c;您可以获得96.5&#xff05;的测试精度。 

非常感谢您阅读本文&#xff0c;有任何问题请在下面留言&#xff01;

点击标题查阅往期内容

图像倾斜校正算法的MATLAB实现&#xff1a;图像倾斜角检测及校正R语言基于Keras的小数据集深度学习图像分类使用Python和Keras进行主成分分析、神经网络构建图像重建使用OpenCV在Python中进行图像处理python卷积神经网络人体图像识别TensorFlow 2keras开发深度学习模型实例&#xff1a;多层感知器(MLP)&#xff0c;卷积神经网络(CNN)和递归神经网络(RNN)R和Python机器学习:广义线性回归glm&#xff0c;样条glm&#xff0c;梯度增强&#xff0c;随机森林和深度学习模型分析matlab使用贝叶斯优化的深度学习Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据用于NLP的Python&#xff1a;使用Keras进行深度学习文本生成如何在python深度学习Keras中计算神经网络集成模型用R语言中的神经网络预测时间序列&#xff1a;多层感知器和极限学习机基于keras平台CNN神经网络模型的服装识别分析用R语言实现神经网络预测股票实例R语言实现拟合神经网络预测和结果可视化R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析用于NLP的Python&#xff1a;使用Keras的多标签文本LSTM神经网络分类

更多内容&#xff0c;请点击左下角“”查看报告全文

dce765819c58d8fffa509a87be6beff0.gif

4a4d538666a272b2e2ad2b999461a1e6.png

9e90c39e65fbdaff39b04eeee1b32908.png

关注我们

案例精选、技术干货 第一时间与您分享

6e6fc1985aebed51792093a3d6f93d5c.png

长按二维码加关注

更多内容&#xff0c;请点击左下角“”查看报告全文

dce765819c58d8fffa509a87be6beff0.gif




推荐阅读
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 基于OpenCV的图像拼接技术实践与示例代码解析
    图像拼接技术在全景摄影中具有广泛应用,如手机全景拍摄功能,通过将多张照片根据其关联信息合成为一张完整图像。本文详细探讨了使用Python和OpenCV库实现图像拼接的具体方法,并提供了示例代码解析,帮助读者深入理解该技术的实现过程。 ... [详细]
  • Android开发技巧:使用IconFont减少应用体积
    本文介绍如何在Android应用中使用IconFont来显示图标,从而有效减少应用的体积。 ... [详细]
  • 本地存储组件实现对IE低版本浏览器的兼容性支持 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • TensorFlow Lite在移动设备上的部署实践与优化笔记
    近期在探索如何将服务器端的模型迁移到移动设备上,并记录了一些关键问题和解决方案。本文假设读者具备以下基础知识:了解TensorFlow的计算图(Graph)、图定义(GraphDef)和元图定义(MetaGraphDef)。此外,文中还详细介绍了模型转换、性能优化和资源管理等方面的实践经验,为开发者提供有价值的参考。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
author-avatar
xi曦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有