基于Keras使用TensorFlow Hub实现迁移学习(tensorflow2.0官方教程翻译)

TensorFlow Hub是一种共享预训练模型组件的方法。

TensorFlow Hub是一个用于促进机器学习模型的可重用部分的发布,探索和使用的库。特别是,它提供经过预先训练的TensorFlow模型,可以在新任务中重复使用。(可以理解为做迁移学习:可以使用较小的数据集训练模型,可以改善泛化和加快训练。)GitHub 地址:https://github.com/tensorflow/hub

有关预先训练模型的可搜索列表,请参阅TensorFlow模块中心TensorFlow Module Hub

本教程演示:

  1. 如何在tf.keras中使用TensorFlow Hub。
  2. 如何使用TensorFlow Hub进行图像分类。
  3. 如何做简单的迁移学习。

1. 安装和导入包

安装命令:pip install -U tensorflow_hub

2. ImageNet分类器

2.1. 下载分类器

使用hub.module加载mobilenet,并使用tf.keras.layers.Lambda将其包装为keras层。 来自tfhub.dev的任何兼容tf2的图像分类器URL都可以在这里工作。

2.2. 在单个图像上运行它

下载单个图像以试用该模型。

(224, 224, 3)

添加批量维度,并将图像传递给模型。

结果是1001元素向量的logits,对图像属于每个类的概率进行评级。因此,可以使用argmax找到排在最前的类别ID:

2.3. 解码预测

我们有预测的类别ID,获取ImageNet标签,并解码预测

png

3. 简单的迁移学习

使用TF Hub可以很容易地重新训练模型的顶层以识别数据集中的类。

3.1. Dataset

对于此示例,您将使用TensorFlow鲜花数据集:

将此数据加载到我们的模型中的最简单方法是使用 tf.keras.preprocessing.image.ImageDataGenerator,

所有TensorFlow Hub的图像模块都期望浮点输入在“[0,1]”范围内。使用ImageDataGeneratorrescale参数来实现这一目的。图像大小将在稍后处理。

结果对象是一个返回image_batch,label_batch对的迭代器。

3.2. 在一批图像上运行分类器

现在在图像批处理上运行分类器。

现在检查这些预测如何与图像对齐:

png

有关图像属性,请参阅LICENSE.txt文件。

结果没有那么完美,但考虑到这些不是模型训练的类(“daisy雏菊”除外),这是合理的。

3.3. 下载无头模型

TensorFlow Hub还可以在没有顶级分类层的情况下分发模型。这些可以用来轻松做迁移学习。

来自tfhub.dev的任何Tensorflow 2兼容图像特征向量URL都可以在此处使用。

创建特征提取器。

它为每个图像返回一个1280长度的向量:

(32, 1280)

冻结特征提取器层中的变量,以便训练仅修改新的分类器层。

3.4. 附上分类头

现在将中心层包装在tf.keras.Sequential模型中,并添加新的分类层。

3.5. 训练模型

使用compile配置训练过程:

现在使用.fit方法训练模型。

这个例子只是训练两个周期。要显示训练进度,请使用自定义回调单独记录每个批次的损失和准确性,而不是记录周期的平均值。

现在,即使只是几次训练迭代,我们已经可以看到模型正在完成任务。

png

png

3.6. 检查预测

要重做之前的图,首先获取有序的类名列表:

通过模型运行图像批处理,并将索引转换为类名。

绘制结果

png

4. 导出你的模型

现在您已经训练了模型,将其导出为已保存的模型:

现在确认我们可以重新加载它,它仍然给出相同的结果:

0.0

这个保存的模型可以在以后加载推理,或转换为TFLiteTFjs

最新版本:https://www.mashangxue123.com/tensorflow/tf2-tutorials-images-hub_with_keras.html
英文版本:https://tensorflow.google.cn/beta/tutorials/images/hub_with_keras
翻译建议PR:https://github.com/mashangxue/tensorflow2-zh/edit/master/r2/tutorials/images/hub_with_keras.md