NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模

Keras 包含 10 个用于图像分类的预训练模型,这些模型是在 Imagenet 数据上训练的。 Imagenet 是一个包含 1000 类图像的大型图像数据集合。 这些预训练模型能够对属于这 1000 个图像类别的任何图像进行分类。

本指南将涵盖以下概念。

  • 图像分类模型。
  • 在 Keras 中使用预训练模型。
  • 在预训练模型上附加我们自己的分类器。
  • 在预训练模型中输入形状。
  • 使用池化。
  • 预训练模型中的冻结层。
  • 使用预训练模型的特定层。

1、图像分类模型

以简化的方式,图像分类模型如下所示。

其中包含卷积层,然后是完全连接层。 卷积层从图像中提取特征,全连接层使用提取的特征对图像进行分类。

当我们在图像数据上训练 CNN 时,可以看出网络的顶层学习从图像中提取一般特征,例如边缘、颜色分布等。随着我们在网络中不断深入,这些层往往会提取更多 具体特征。

现在我们可以使用这些已经知道如何提取特征并避免从头开始训练的预训练模型。 这个概念被称为迁移学习。

2、使用预训练模型

在 Keras 中有两种创建模型的方法。 一种是顺序模型,另一种是函数式 API。 顺序模型是层的线性堆栈。 你只需调用 add 方法即可继续在顺序模型中添加层。 另一个是函数式 API,它允许你创建可能包含多个输入和输出的更复杂的模型。

我将在本指南中使用 VGG16 预训练模型的示例。 我们可以类似地使用其他预训练模型。

Keras 的application模块中提供了所有预训练模型。 首先,我们必须按如下方式导入预训练模型。

from keras.applications.vgg16 import VGG16

然后我们可以像下面这样添加预训练模型,在顺序模型或函数式 API 中。

使用顺序模型
使用函数时API

要使用预训练权重,我们必须将参数权重设置为 imagenet。 默认值也设置为 imagenet。 但是如果我们想从头开始训练模型,我们可以将 weights 参数设置为 None。 这将在网络中随机初始化权重。

3、附加我们自己的分类器

我们可以删除默认分类器并在预训练模型中附加我们自己的分类器。 要排除默认分类器,我们必须将参数 include_top 设置为 false。

在下面的示例中,我将从 VGG 中删除默认分类器,然后附加我自己的分类器,它只是一个密集层。 我们还必须在添加密集层之前包括一个展平层,以将卷积层的 4D 输出转换为 2D,因为密集层接受 2D 输入。

4、输入形状

VGG16 在大小为 (224, 224) 的 RGB 图像上进行训练,这是网络的默认输入大小。 我们还可以提供默认尺寸以外的输入图像。 但图像的高度和宽度应大于 32 像素。 当我们从网络中排除默认分类器时,我们只能提供其他尺寸的图像。 以下是显示输入大小 (32, 64, 3) 的示例。 最后一个维度是 3,表示颜色通道的数量。

我们还可以通过提供输入张量来定义输入形状,如下例所示。

我们可以注意到,当我们提供有意义的较小尺寸图像时,输出维度也会被压缩。

5、池化

我们可以对卷积层的最终输出应用两种类型的池化。 全局平均池化和全局最大池化。

在全局最大池化中,我们在张量的每张片子上选择一个最大数,如下图所示。

假设卷积层的输出张量形状为 (7, 7, 512)。 如果我们应用全局最大池化,我们从每张 (7, 7) 幻灯片中选择一个最大数字,总共有 512 个数字。 除了取平均值而不是最大值之外,平均池化做同样的事情。

为了使用池化,我们必须将参数池化设置为 max 或 avg 以使用这 2 个池化。 在下面的示例中,我使用了全局平均池化。

当我们有可变大小的输入图像时,全局池化很有用。 假设我们有来自不同大小图像的 2 个不同大小的输出张量。 输出张量的形状为 (3, 3, 512) 和 (7, 7, 512)。 在对这些张量中的任何一个应用全局池化后,我们将得到一个长度为 512 的固定大小的向量。因此,在应用全局池化后,可变大小图像的最终输出仍将是一个固定大小的向量。

6、冻结层

在训练网络之前,你可能希望根据任务冻结其某些层。 一旦一个层被冻结,它的权重在训练时就不会更新。

在下面的示例中,我冻结了网络的前 10 层。 我已经打印了网络中的所有层以及它们是否可训练。 我们可以看到只有前 10 层是不可训练的。

如果当前数据集与训练这些网络的数据集相似,那么最好冻结所有层,因为两个数据集中的图像具有相似的特征。 但是如果数据集不同,那么我们应该只冻结顶层并训练底层,因为顶层提取一般特征。 数据集越相似,我们应该冻结更多的层。

7、使用特定图层

在上面的示例中,我们可以看到模型包含的所有层。 我们也可以单独选择这些层中的任何一个并在我们的模型中使用它们。

在以下示例中,我将第 3 层预训练模型 (block1_conv2) 添加到顺序模型中。


原文链接:A Simple Guide to Using Keras Pretrained Models

BimAnt翻译整理,转载请标明出处