美文网首页大数据 爬虫Python AI Sql玩转大数据大数据部落
R语言基于Keras的小数据集深度学习图像分类

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

作者: 拓端tecdat | 来源:发表于2020-04-06 11:17 被阅读0次

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

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

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

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

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

    下载数据

    使用 Dogs vs. Cats数据集 。

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

    need-to-insert-img

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

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

    < - “?/ 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”) ","classes":{"has":1},"lang":""}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">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”)

    need-to-insert-img

    使用预训练的convnet

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

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

    特征提取

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

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

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

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

    让我们实例化VGG16模型。

    < -application_vgg16(weights =“imagenet”,include_top = FALSE,input_shape = c(150,150,3))","classes":{"has":1},"lang":""}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"> conv_base < -application_vgg16(weights =“imagenet”,include_top = FALSE,input_shape = c(150,150,3))

    need-to-insert-img

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

    weights 指定从中初始化模型的权重检查点。

    include_top“密集连接”是指在网络顶部包括(或不包括)密集连接的分类器。默认情况下,此密集连接的分类器对应于ImageNet的1,000个类。因为您打算使用自己的密集连接分类器(只有两个类:cat和dog),所以您不需要包含它。

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

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

    分享:

    相关文章

      网友评论

        本文标题:R语言基于Keras的小数据集深度学习图像分类

        本文链接:https://www.haomeiwen.com/subject/wjkmphtx.html