适用于图像任务的通用 SavedModel API

此页面介绍了适用于图像相关任务的 TF2 SavedModel 应如何实现 可重复使用的 SavedModel API。(这取代了现在已弃用的 TF1 Hub 格式图像通用签名。)

图像特征向量

用法摘要

图像特征向量是一个稠密的 1-D 张量,它表示一整幅图像,通常供消费者模型中的简单前馈分类器使用。(就经典 CNN 而言,这是在空间范围被池化或扁平化掉之后,但在分类完成之前,瓶颈值;为此,请参阅下文的 图像分类。)

用于图像特征提取的可重复使用的 SavedModel 在根对象上有一个 __call__ 方法,该方法将一批图像映射到一批特征向量。它可以像这样使用

obj = hub.load("path/to/model")  # That's tf.saved_model.load() after download.
images = ...  # A batch of images with shape [batch_size, height, width, 3].
features = obj(images)   # A batch with shape [batch_size, num_features].

在 Keras 中,等效项是

features = hub.KerasLayer("path/to/model")(images)

输入遵循 图像输入 的一般惯例。模型文档指定了输入的 heightwidth 的允许范围。

输出是一个数据类型为 float32 且形状为 [batch_size, num_features] 的单张量。batch_size 与输入中的相同。num_features 是一个与输入大小无关的特定于模块的常量。

API 详情

可重复利用的 SavedModel API 还提供了一个 obj.variables 列表(例如,在不急切加载时进行初始化)。

支持微调的模型提供了一个 obj.trainable_variables 列表。它可能要求你传递 training=True 以在训练模式下执行(例如,对于 dropout)。一些模型允许可选参数覆盖超参数(例如,dropout 率;将在模型文档中描述)。该模型还可能提供一个 obj.regularization_losses 列表。有关详细信息,请参阅 可重复利用的 SavedModel API

在 Keras 中,这是由 hub.KerasLayer 处理的:使用 trainable=True 对其进行初始化以启用微调,并且(在罕见的情况下应用 hparam 覆盖时)使用 arguments=dict(some_hparam=some_value, ...))

注释

是否对输出特征应用 dropout 应留给模型使用者。SavedModel 本身不应对实际输出执行 dropout(即使它在其他地方内部使用 dropout)。

示例

图像特征向量的可重复利用的 SavedModels 用于

图像分类

用法摘要

图像分类将图像的像素映射到线性分数(logits),用于判断图像是否属于 由模块发布者 选定的分类法中的类别。这允许模型使用者从发布者模块学习的特定分类中得出结论。(对于使用一组新类别的图像分类,通常会重复使用 图像特征向量 模型,并使用新的分类器。)

用于图像分类的可重复利用的 SavedModel 在根对象上有一个 __call__ 方法,该方法将一批图像映射到一批 logits。它可以像这样使用

obj = hub.load("path/to/model")  # That's tf.saved_model.load() after download.
images = ...  # A batch of images with shape [batch_size, height, width, 3].
logits = obj(images)   # A batch with shape [batch_size, num_classes].

在 Keras 中,等效项是

logits = hub.KerasLayer("path/to/model")(images)

输入遵循 图像输入 的一般惯例。模型文档指定了输入的 heightwidth 的允许范围。

输出 logits 是一个数据类型为 float32 且形状为 [batch_size, num_classes] 的单张量。 batch_size 与输入中的相同。 num_classes 是分类中的类数,这是一个特定于模型的常量。

logits[i, c] 是一个分数,预测示例 i 在索引为 c 的类中的成员资格。

这些分数是否要与 softmax(对于互斥类)、sigmoid(对于正交类)或其他内容一起使用,这取决于底层分类。模块文档应对此进行描述,并参考类索引的定义。

API 详情

可重复利用的 SavedModel API 还提供了一个 obj.variables 列表(例如,在不急切加载时进行初始化)。

支持微调的模型提供了一个 obj.trainable_variables 列表。它可能要求你传递 training=True 以在训练模式下执行(例如,对于 dropout)。一些模型允许可选参数覆盖超参数(例如,dropout 率;将在模型文档中描述)。该模型还可能提供一个 obj.regularization_losses 列表。有关详细信息,请参阅 可重复利用的 SavedModel API

在 Keras 中,这是由 hub.KerasLayer 处理的:使用 trainable=True 对其进行初始化以启用微调,并且(在罕见的情况下应用 hparam 覆盖时)使用 arguments=dict(some_hparam=some_value, ...))

图像输入

这是所有类型的图像模型的共性。

将一批图像作为输入的模型会将它们作为数据类型为 float32 且形状为 [batch_size, height, width, 3] 的密集 4-D 张量接受,其元素是归一化到 [0, 1] 范围内的像素的 RGB 颜色值。这是从 tf.image.decode_*() 后跟 tf.image.convert_image_dtype(..., tf.float32) 获得的。

该模型接受任何 batch_size。模型文档指定了 heightwidth 的允许范围。最后一个维度固定为 3 个 RGB 通道。

建议模型始终使用张量的 channels_last(或 NHWC)布局,并让 TensorFlow 的图优化器在需要时将其重写为 channels_first(或 NCHW)。