关于预先训练过的模型

在本专栏中,我们要解决的问题是pretrained模型.有很多型号可供选择,所以要覆盖的范围很广。

今天我想做一些稍微不同的事情。我将要回答的问题都是基于MathWorks中提出的问题
社区论坛
. 在深入探讨我在浏览MATLAB答案时经常遇到的问题之前,我将总结论坛上的答案:他们为什么问这个?

考虑到这一点,本专栏将着眼于选择预训练模型的基础知识,如何知道你是否做出了正确的选择,以及关于预训练模型的三个问题:

1.在训练网络时,我应该操纵数据大小还是模型输入大小?

2.为什么要将预先训练好的YOLO模型导入MATLAB?

3.为什么要冻结一个预先训练过的模型的重量?

选择一个预先训练过的模型

有相当多的型号可供选择,而且随着时间的推移,这个名单只会继续变长。这有很多原因。这也可能让人有些畏惧:你如何选择,你如何知道自己做出了正确的选择?

我不愿意把所有预先训练过的模型看成一长串的选项,我更愿意把它们分类。

基本模型

这些模型具有简单的体系结构,可以让您自信地启动和运行。它们往往有更少的层,并允许快速迭代预处理和训练选项。一旦掌握了如何训练模型,就可以进入下一节,看看是否可以改进结果。

从这里开始:GoogLeNet, VGG-16, VGG-19和AlexNet

模型精度高

这些模型包括基于图像的工作流程,如图像分类、对象检测和语义分割。大多数网络,包括上面的基本模型,都属于这一类。基本模型和高精度模型的不同之处在于,这些模型需要更多的训练时间,网络结构更加复杂。

从这里开始:ResNet-50, Inception-v3, Densenet-201,例外

对象检测工作流。DarkNet-19和DarkNet-53经常被推荐作为检测和YOLO类型工作流程的基础。我也看到过ResNet-50与Faster R-CNN一起使用,所以这里也有一些灵活性。我们将在下面的问题中深入了解物体检测的更多细节。

语义分割。你可以把一个网络变成一个
语义分割
网络。也有特定的Segnet结构,如
赛格莱特
unetLayers

边缘部署模型

当转向硬件时,模型大小变得越来越重要。这些型号的设计意图是为树莓派(Raspberry Pi)等嵌入式设备提供低内存占用。

从这里开始:SqueezeNet, MobileNet-v2, ShuffLeNet, NASNetMobile

基本模型

这些模型具有简单的体系结构,可以让您自信地启动和运行。它们往往有更少的层,并允许快速迭代预处理和训练选项。一旦掌握了如何训练模型,就可以进入下一节,看看是否可以改进结果。

从这里开始:GoogLeNet, VGG-16, VGG-19和AlexNet

精度高的模型

这些模型包括基于图像的工作流程,如图像分类、对象检测和语义分割。大多数网络,包括上面的基本模型,都属于这一类。与基本模型不同的是,高精度模型可能需要更多的训练时间,网络结构也更加复杂。

从这里开始:ResNet-50, Inception-v3, Densenet-201,例外

对象检测工作流。DarkNet-19和DarkNet-53经常被推荐作为检测和YOLO类型工作流程的基础。我也看到过ResNet-50与Faster R-CNN一起使用,所以这里也有一些灵活性。我们将在下面的问题中深入了解物体检测的更多细节。

语义分割。你可以把一个网络变成一个
语义分割
网络。也有特定的Segnet结构,如
赛格莱特
unetLayers

边缘部署模型

当转向硬件时,模型大小变得越来越重要。这些型号旨在具有低内存占用,用于嵌入式设备,如Raspberry Pi™。


从这里开始:SqueezeNet, MobileNet-v2, ShuffLeNet, NASNetMobile

这些只是一般的指导方针,以便在尝试选择模型时给您一些指导。我将从第一类开始,并在必要时继续使用更复杂的模型。就我个人而言,我认为使用AlexNet作为起点并没有什么错。这是一个很容易理解的架构五月根据问题适当地执行。

你怎么知道你选择了正确的模式?

对于你的任务可能没有一个正确的选择。当模型精确地执行给定任务时,您就会知道您有了一个可接受的模型。你认为可接受的准确度水平在不同的应用中有很大的不同。想想谷歌在购物时的错误建议和错过的暴风雪警告之间的区别。

为您的应用程序尝试各种预训练的网络是确保获得最精确和最健壮模型的关键。当然,网络体系结构只是你要取得成功所需要的众多拨号中的一个。

查看网上提供的最新预训练车型
MatlabGithub页面

第一季度

训练网络时,我应该操作数据大小还是模型输入大小?

首先简单介绍一下数据输入模型的背景知识。


所有预先训练的模型都有一个输入数据结构的期望,以便重新训练网络或预测新的数据。如果您的数据不符合模型的期望,您会发现自己在问这些问题。


有趣的是:你是操纵数据,还是操纵模型?


最简单的方法是改变的数据。这可能非常简单:可以通过调整数据的大小来操纵数据的输入大小。在MATLAB®,这很简单
imresize
命令。灰度问题也变得非常简单。

彩色图像通常以RGB格式表示,其中三层代表每个平面的红、绿、蓝颜色。灰度图像只包含一层而不是三层。可以复制灰度图像的单层来创建网络所期望的输入结构,如下图所示。

以原始颜色显示的猿,然后在红色平面、绿色平面和蓝色平面中显示灰色。

看一幅色彩非常丰富的图像,注意RGB平面看起来像三个灰度图像结合起来形成一个彩色图像。

不那么简单的方法是更改模型.为什么有人要费这么大劲去操纵模型而不是数据呢?

您可用的输入数据将为您确定这一点。

假设你的图像是1000x1000px,你的模型接受10x10px大小的图像。如果你调整你的图像大小为10x10px,你会留下一个输入图像的噪声。在这种情况下,您希望更改模型的输入层,而不是您的输入。

图像大小:1000 x1000px

清晰可见的狗的形象

图片尺寸:10 x10px

在我尝试用MATLAB之前,我认为操纵模型输入是一项复杂的任务,但它并没有那么糟糕。我保证。你要做的就是:

1.打开
深度网络设计师app

2.选择一个预先训练过的模型。

3.删除当前输入层并将其替换为新层。这使您能够更改输入大小。

4.导出模型,您就可以将其用于迁移学习应用程序了。我建议用
基本迁移学习示例

它真的非常简单,你可以改变预先训练模型的输入大小,而无需手工编码。

第二季

为什么要将预先训练好的YOLO模型导入MATLAB?

这个问题是基于
coco数据集上的Yolo v3训练
,答案很简单。背景很简单。
例子YOLO
通过培训YOLO v2网络与ResNet-50在MATLAB中使用。
YOLO代表“你只看一次”。有多个版本的算法可用,与
v3添加改进

在v2上定位较小的物体。YOLO首先使用特征提取网络(使用预先训练过的模型,如ResNet-50或DarkNet-19),然后进行本地化。

所以为什么导入预训练的YOLO模型到MATLAB?YOLO是用于对象检测的最流行的算法之一。物体检测比简单的物体识别问题带来更多的挑战。使用对象检测,您不仅需要识别对象,还需要确定它的位置。

有两类物体探测器:YOLO是一种单级探测器,Faster R-CNN是两级探测器。

  • 一级探测器可以实现高的速度在检测。
这个文档页面
详细介绍了YOLO v2算法。
  • 两级检测器具有较高的定位和目标识别能力准确性。
这个文档页面
看R-CNN算法的基础。

有许多对象检测的应用程序需要进一步探索,但我强烈建议从一个简单的对象检测示例开始并从这里开始构建。

第三季

为什么要冻结一个预先训练过的模型的重量?

这个问题是基于
如何冻结[a]神经网络模型的具体权重? 点击这里观看视频。
为了回答这个问题,我们将从一些代码开始。

导入经过预训练的网络后,您可以选择以下方式冻结权重:

冻结所有初始层:

层(1:10)= freezeWeights(层(1:10));

冻结各个图层:

层。WeightLearnRateFactor = 0;
冻结每一层允许被冻结:

函数层= freezeWeights(层)

2 = 1:尺寸(层,1)

道具=属性(层(2));

p = 1:元素个数(道具)

propName =道具{p};

如果~ isempty(正则表达式(propName“美元LearnRateFactor”“一次”))

层(ii)。(propName) = 0;

结束

结束

结束

结束

如果层有
LearnRateFactor
然后把它设为零。别管其他图层。

冻结重量有两个好处,你可以:

  • 加快培训.由于冻结层的梯度不需要计算,冻结许多初始层的权值可以显著加快网络训练速度。
  • 防止过度拟合.如果新数据集很小,冻结较早的网络层可以防止这些层与新数据集过度拟合。
你也可以将一个预先训练过的模型的权重应用到你的模型中,从而创建一个未经训练的“训练”网络。检查出
装配网络
在MATLAB中工作,看看如何创建一个深度学习网络从层没有训练。
最后,说到权重,您可以使用加权分类输出层来处理类分布不平衡的分类问题。这是一个
使用自定义加权分类层的示例

想要更多吗?

今天就到这里!我们打开MATLAB解决了三个问题。我希望这对你有用。如果你有一个深入学习的问题或话题,你想看到讨论,添加在下面的表格中。

谢谢你的建议!