文件交换选择的一周

我们最好的用户提交

深度学习教程系列

我们本周的客座文章是由约翰娜她的本周精选是一本新书深度学习教程系列。这篇文章将介绍教程,一个关于深度学习的新视频系列,以及许多其他入门深度学习的链接。享受吧!

Avi写了关于深度学习的文章11行代码。如果你刚刚开始深度学习,我鼓励你先去那里:这是一个很棒的帖子,也是一个很好的开始方式。但是让我们再深入一点。如果我们想创建自己的网络来识别,会发生什么呢新对象在图片?

文件交换条目将为您提供3个示例:

  • 从头开始训练一个神经网络
  • 转移学习
  • 使用神经网络作为特征提取器


这三个示例旨在帮助您为数据创建自定义神经网络。此外,它们的代码少于125行……总!


示例使用来自的图像构建CIFAR-10,一个公开可用的相对较小的[32 × 32像素]图像数据库。包含一个名为DownloadCIFAR10.m这将下载图像并将它们放入测试和培训文件夹中。下载和提取这些映像需要一些时间,但您只需要运行一次即可。


如果您还没有准备好深入研究代码,或者如果您想要一个深度学习概述,看看我们关于神经网络的介绍视频系列。这将有助于回答以下问题:
•什么是深度学习?
•什么是神经网络?
•机器学习和深度学习的区别是什么?

深度学习入门系列



所有的例子都需要大量的图像数据集。如果您是MATLAB的新手,并且您有很多数据-图像数据或其他-请查看ImageDatastore这是建立在数据存储以便更好地管理大量数据。


从头开始训练一个神经网络

我们将从头开始创建一个可以识别4类对象的神经网络。听起来吓人吗?神经网络只是一系列的层,每一层改变输入,并将输出传递给下一层。这个图有助于可视化这个过程。



想要更深入地了解cnn吗?看看这个简短的视频,我们深入了解卷积神经网络的关键方面。

代码将为您提供一个预定义的神经网络作为开始,但是从头开始创建网络的概念意味着您可以自由地探索架构并根据您认为合适的方式进行更改。这是一个机会,让我们看看改变层是如何影响准确率的。在不做任何修改的情况下运行示例中的代码—您将看到准确率约为75%。你能找到进一步提高准确度的方法吗?


转移学习


迁移学习是一种有点奇怪的概念,你可以把别人完全成熟的网络,转移它所有的学习成果,去学习一组全新的对象。如果一个网络输入了数百万张狗和猫的图像,并且可以准确地预测这些类别,那么它可能只需要几百张图像就可以学习一个新的类别,比如兔子。学习可以是转移到新的类别。就像视频中解释的那样,如果你的新识别任务相似或已经完成,这将有所帮助相似的特征回到原来的类别。例如,在狗身上训练的网络可能非常适合于相对较快地学习其他动物。


这也有助于有一个准确的网络这就是为什么我们将使用AlexNet开始我们的例子,AlexNet是赢得2012年ILSVRC竞赛的卷积神经网络。它已经在许多动物身上进行了训练,因为我们想要识别狗、青蛙、猫和鹿,我们希望这个网络能成为一个很好的起点。

在MATLAB中导入AlexNet是轻而易举的事情

Net = alexnet;

如果这是您第一次运行此代码,您可能会收到一条错误消息。点击链接下载AlexNet。你只需要下载AlexNet一次。

让我们看看网络的最后几层。你会看到AlexNet被训练了1000种不同类别的对象。

层=净。层
…23 'fc8'全连接1000完全连接层24 'prob' Softmax Softmax 25 'output'分类输出与'tench', '金鱼'和998其他类交叉


顺便说一句,如果你想看到AlexNet训练的所有1000个类别,这里有一行有趣的代码:

class_names = net.Layers(end).ClassNames;


回到演示。注意到第23层,上面写着1000个完全连接层?我们需要将1000改为4,因为我们有四类对象。

从AlexNet获取图层,然后添加我们自己的图层

Layers = Layers (1:end-3);layers(end+1) = fulllyconnectedlayer (4, 'Name', 'fc8_2 ');layers(end+1) = softmaxLayer;layers(end+1) = classificationLayer()


在我们改变网络之后,我们可以快速地重新训练它

convnet = trainNetwork(imds, layers, options);

*快速是一个相对的术语,取决于你的硬件和训练图像的数量。

最后,我们有一个自定义网络来识别我们的四类对象:


它做得怎么样?运行这个脚本给了我大约80%的准确率。当然,这是一个随机的过程,所以你可以预料到这个数字会有轻微的变化。你能在这四个类别上得到更高的准确度吗?请在下方留言!


特征提取



也许神经网络的一个不太常见的技术是使用它们作为特征提取器。这到底是什么意思?Gabriel在上面的视频中很好地解释了特征和特征提取的概念。

神经网络的准确性部分是由于用于训练它们的大量数据。事实上,AlexNet——作为第二个和第三个例子的起点的网络——是在其上进行训练的数百万的图像。您可以期望网络的较低层可以识别定义单个对象的丰富特征,那么如果我们简单地提取这些特征会发生什么呢?

这里,我们有一个典型的机器学习和深度学习工作流程。让我们将这些工作流组合起来,创建一个超级分类器*
*超级分类器不是一个技术术语。

使用CNN作为特征提取技术,然后在机器学习模型中使用这些特征,这是深度学习的一种高度通用的应用。


请注意MATLAB使从测试集中提取这些特征变得多么容易。

featureLayer = 'fc7';trainingFeatures = activated (convnet, trainingSet, featureLayer);


特征可以从网络中的任何位置提取。我们选择最后一个完全连接的层,这将是我们类别中最复杂和最具描述性的,但你可以在更早的阶段选择特征。如果从另一层选择特征呢?这对准确性有什么影响?您甚至可以可视化网络的激活这个例子

使用特征提取方法的另一个好处是能够选择最适合数据的分类器。我们在视频中使用了一个多类svm:

fitcecoc

我们也可以选择一个倍数类朴素贝叶斯模型fitcnb-或k近邻分类模型-fitcknn-或其他各种分类模型。


有这么多选择很好,但是你到底怎么知道选择哪个分类器呢?


查看我们的分类学习应用程序找到数据的最佳模型。

使用卷积神经网络进行特征提取的另一个优点是,你需要更少的数据来获得准确的结果。在演示的最后,我们看到,使用最少的数据,我们获得了大约77%的准确率。在这个例子中,我们有意使用较少的数据[每个类别50张图像]来展示如何在没有数千张样本图像的情况下仍然使用深度学习方法。增加训练图像的数量是否也会提高准确率?


以第11行代码为例

[trainingSet, ~] = splitEachLabel(imds, 50, 'randomize');


把50换成更大的数字来增加每个类别的样本数。

总结

这三个示例和相应的视频可以帮助您探索使用深度学习技术创建自定义对象识别模型的3种不同方法。

试试吧,让我们知道你的想法在这里或者留下评论深度学习团队

|
  • 打印
  • 发送电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。