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

简介: R语言基于Keras的小数据集深度学习图像分类

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


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

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

让我们从掌握数据开始吧。


下载数据

使用 Dogs vs. Cats数据集 。  

图片是中等分辨率的彩色JPEG。这里有些例子:



该数据集包含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,“train”)dir.create(train_dir)validation_dir < -  file。path(base_dir,“validation”)


使用预训练的convnet

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

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

特征提取

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

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

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


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


让我们实例化VGG16模型。


conv_base < -  application_vgg16(weights =“imagenet”,include_top = FALSE,input_shape = c(150,150,3))

您将三个参数传递给函数:

  • weights 指定从中初始化模型的权重检查点。
  • include_top“密集连接”是指在网络顶部包括(或不包括)密集连接的分类器。默认情况下,此密集连接的分类器对应于ImageNet的1,000个类。因为您打算使用自己的密集连接分类器(只有两个类:cat和dog),所以您不需要包含它。
  • input_shape是您将提供给网络的图像张量的形状。这个参数纯粹是可选的:如果你不传递它,网络将能够处理任何大小的输入。

它类似于你已经熟悉的简单的网络:

summary(conv_base)

Layer (type)                     Output Shape          Param #
================================================================
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
================================================================
Total params: 14,714,688
Trainable params: 14,714,688

此时,有两种方法可以继续:

  • 在数据集上运行卷积基 。
  • conv_base通过在顶部添加密集层来扩展您拥有的模型() 。

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


特征提取

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


model < -  keras_model_sequential()%>%conv_base%>%layer_flatten()%>%layer_dense( = 256,activation =“relu”)%>%layer_dense(u its =  ,   “sigmoid”)

这就是模型现在的样子:

summary(model)

Layer (type)                     Output Shape          Param #
================================================================
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
================================================================
Total params: 16,812,353
Trainable params: 16,812,353
Non-trainable params: 0

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


Keras中, 使用以下freeze_weights()函数冻结网络:




freeze_weights(conv_base)length(model $ trainable_weights)


数据扩充

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

在Keras中,这可以通过配置要对由a读取的图像执行的多个随机变换来完成image_data_generator()。例如:


train_datagen = image_data_generator(rescale = 1/255,  = 40,width_shift_range = 0.2,height_shift_range = 0.2,  = 0.2,zoom_range = 0.2,horizo  = TRUE,fill_mode =“nearest”)

浏览一下这段代码:

  • rotation_range 是一个度数(0-180)的值,一个随机旋转图片的范围。
  • width_shift并且height_shift是在垂直或水平方向上随机平移图片的范围(作为总宽度或高度的一部分)。
  • shear_range 用于随机应用剪切变换。
  • zoom_range 用于随机缩放图片内部。
  • horizontal_flip 用于水平地随机翻转一半图像 - 当没有水平不对称假设时相关(例如,真实世界的图片)。
  • fill_mode 是用于填充新创建的像素的策略,可以在旋转或宽度/高度偏移后出现。

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


validation_generator < -  flow_images_from_directory(validation_dir,test_datagen,target_size = c(150,150),batch_size = 20,class_mode =“binary”)model%>%compile(loss =“binary_crossentropy”,optimizer = optimizer_rmsprop(lr = 2e-5),metrics = c(“accuracy”))history < -  model%>%fit_generator(train_generator,steps_per_epoch = 100,

让我们绘制结果。准确率达到约90%。

微调

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

  • 在已经训练过的基础网络上添加自定义网络。
  • 冻结基础网络。
  • 训练你添加的部分。
  • 解冻基础网络中的某些层。
  • 联合训练这些层和您添加的部分。

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

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


model%>%compile(lo ropy”,optimizer = opt imizer_rmsprop(lr = 1e-5),metrics = c(“accuracy”))his el%>%fit_generator(train_ g steps_per_epoch = 100,epochs = 100 ,validation_data = validation_genera tor,validation_steps = 50)

让我们绘制结果:

·

你可以看到准确度有6%的绝对提升,从大约90%到高于96%。

您现在可以最终在测试数据上评估此模型:

test_generator < -   (test_dir,test_datagen,target_size = c(150,150),batch_size = 20,  =“binary”)

model%>%evaluate_generator( ,steps = 50)


$ loss

[1] 0.2158171

 

$ acc

[1] 0.965
相关文章
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
深度学习中的图像风格迁移
【9月更文挑战第26天】本文将探讨如何利用深度学习技术,实现图像风格的转换。我们将从基础的理论出发,然后逐步深入到具体的实现过程,最后通过代码实例来展示这一技术的实际应用。无论你是初学者还是有经验的开发者,都能在这篇文章中找到有价值的信息。让我们一起探索深度学习的奥秘吧!
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
深度学习之格式转换笔记(三):keras(.hdf5)模型转TensorFlow(.pb) 转TensorRT(.uff)格式
将Keras训练好的.hdf5模型转换为TensorFlow的.pb模型,然后再转换为TensorRT支持的.uff格式,并提供了转换代码和测试步骤。
87 3
深度学习之格式转换笔记(三):keras(.hdf5)模型转TensorFlow(.pb) 转TensorRT(.uff)格式
|
1月前
|
机器学习/深度学习 人工智能 TensorFlow
利用深度学习实现图像风格迁移
【8月更文挑战第73天】本文通过深入浅出的方式,介绍了一种使用深度学习技术进行图像风格迁移的方法。我们将探讨如何将一张普通照片转化为具有著名画作风格的艺术作品。文章不仅解释了背后的技术原理,还提供了一个实际的代码示例,帮助读者理解如何实现这一过程。
|
20天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的地面垃圾识别分类技术
AI垃圾分类系统结合深度学习和计算机视觉技术,实现高效、精准的垃圾识别与自动分类。系统集成高精度图像识别、多模态数据分析和实时处理技术,适用于市政环卫、垃圾处理厂和智能回收设备,显著提升管理效率,降低人工成本。
基于深度学习的地面垃圾识别分类技术
|
22天前
|
机器学习/深度学习 编解码 算法
什么是超分辨率?浅谈一下基于深度学习的图像超分辨率技术
超分辨率技术旨在提升图像或视频的清晰度,通过增加单位长度内的采样点数量来提高空间分辨率。基于深度学习的方法,如SRCNN、VDSR、SRResNet等,通过卷积神经网络和残差学习等技术,显著提升了图像重建的质量。此外,基于参考图像的超分辨率技术通过利用高分辨率参考图像,进一步提高了重建图像的真实感和细节。
|
1月前
|
机器学习/深度学习 数据处理 数据库
基于Django的深度学习视频分类Web系统
基于Django的深度学习视频分类Web系统
55 4
基于Django的深度学习视频分类Web系统
|
17天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习的奇迹:如何用神经网络识别图像
【10月更文挑战第33天】在这篇文章中,我们将探索深度学习的奇妙世界,特别是卷积神经网络(CNN)在图像识别中的应用。我们将通过一个简单的代码示例,展示如何使用Python和Keras库构建一个能够识别手写数字的神经网络。这不仅是对深度学习概念的直观介绍,也是对技术实践的一次尝试。让我们一起踏上这段探索之旅,看看数据、模型和代码是如何交织在一起,创造出令人惊叹的结果。
26 0
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
95 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习入门案例:运用神经网络实现价格分类
深度学习入门案例:运用神经网络实现价格分类
|
2月前
|
机器学习/深度学习 并行计算 PyTorch
图像检测【YOLOv5】——深度学习
Anaconda的安装配置:(Anaconda是一个开源的Python发行版本,包括Conda、Python以及很多安装好的工具包,比如:numpy,pandas等,其中conda是一个开源包和环境管理器,可以用于在同一个电脑上安装不同版本的软件包,并且可以在不同环境之间切换,是深度学习的必备平台。) 一.Anaconda安装配置. 1.首先进入官网:https://repo.anaconda.com,选择View All Installers. 2.打开看到的界面是Anaconda的所以安装包版本,Anaconda3就代表是Python3版本,后面跟的是发行日期,我选择了最近的2022
73 28
下一篇
无影云桌面