此页面介绍了 TF1 Hub 格式 中的模块应实现的适用于图像相关任务的通用签名。(有关 TF2 SavedModel 格式,请参阅类似的 SavedModel API。)
某些模块可用于多项任务(例如,图像分类模块倾向于在过程中进行一些特征提取)。因此,每个模块提供(1)发布者预期的所有任务的命名签名,以及(2)其指定主要任务的默认签名 output = m(images)
。
图像特征向量
用法摘要
图像特征向量是一个稠密的 1-D 张量,表示整个图像,通常由消费者模型进行分类。(与 CNN 的中间激活不同,它不提供空间细分。与 图像分类 不同,它会丢弃发布者模型学习的分类。)
用于图像特征提取的模块具有将一批图像映射到一批特征向量的默认签名。它可以用作
module_spec = hub.load_module_spec("path/to/module")
height, width = hub.get_expected_image_size(module_spec)
images = ... # A batch of images with shape [batch_size, height, width, 3].
module = hub.Module(module_spec)
features = module(images) # A batch with shape [batch_size, num_features].
它还定义了相应的命名签名。
签名规范
用于提取图像特征向量的命名签名调用为
outputs = module(dict(images=images), signature="image_feature_vector",
as_dict=True)
features = outputs["default"]
输入遵循 图像输入 的一般约定。
输出词典包含一个 dtype 为 float32
且形状为 [batch_size, num_features]
的 "default"
输出。batch_size
与输入中相同,但在构建图形时未知。num_features
是已知的、与输入大小无关的模块特定常量。
这些特征向量旨在可用于具有简单前馈分类器的分类(例如,用于图像分类的典型 CNN 中最顶层的卷积层的池化特征)。
是否对输出特征应用 dropout 应留给模块使用者。模块本身不应对实际输出执行 dropout(即使它在其他地方内部使用 dropout)。
输出词典可以提供更多输出,例如,模块内部隐藏层的激活。它们的键和值取决于模块。建议使用架构名称为架构相关的键添加前缀(例如,为了避免将中间层 "InceptionV3/Mixed_5c"
与最顶层的卷积层 "InceptionV2/Mixed_5c"
混淆)。
图像分类
用法摘要
图像分类将图像的像素映射到线性分数(logits),以确定其是否属于由模块发布者选择的分类法中的类别。这使用户能够从发布者模块学习的特定分类中得出结论,而不仅仅是其底层特征(参见 图像特征向量)。
用于图像特征提取的模块具有将一批图像映射到一批 logits 的默认签名。它可以用作
module_spec = hub.load_module_spec("path/to/module")
height, width = hub.get_expected_image_size(module_spec)
images = ... # A batch of images with shape [batch_size, height, width, 3].
module = hub.Module(module_spec)
logits = module(images) # A batch with shape [batch_size, num_classes].
它还定义了相应的命名签名。
签名规范
用于提取图像特征向量的命名签名调用为
outputs = module(dict(images=images), signature="image_classification",
as_dict=True)
logits = outputs["default"]
输入遵循 图像输入 的一般约定。
输出字典包含一个 "default"
输出,其数据类型为 float32
,形状为 [batch_size, num_classes]
。 batch_size
与输入中的相同,但在构建图形时未知。 num_classes
是分类中的类数,这是一个已知的常量,与输入大小无关。
评估 outputs["default"][i, c]
会产生一个分数,预测示例 i
在索引为 c
的类中的成员资格。
这些分数是否应与 softmax(用于互斥类)、sigmoid(用于正交类)或其他内容一起使用,取决于底层分类。模块文档应对此进行描述,并参考类索引的定义。
输出词典可以提供更多输出,例如,模块内部隐藏层的激活。它们的键和值取决于模块。建议使用架构名称为架构相关的键添加前缀(例如,为了避免将中间层 "InceptionV3/Mixed_5c"
与最顶层的卷积层 "InceptionV2/Mixed_5c"
混淆)。
图像输入
这适用于所有类型的图像模块和图像签名。
接受一批图像作为输入的签名将它们作为数据类型为 float32
且形状为 [batch_size, height, width, 3]
的密集 4-D 张量,其元素是归一化到 [0, 1] 范围的像素的 RGB 颜色值。这是从 tf.image.decode_*()
后跟 tf.image.convert_image_dtype(..., tf.float32)
获得的。
具有恰好一个(或一个主)图像输入的模块将名称 "images"
用于此输入。
该模块接受任何 batch_size
,并相应地将 TensorInfo.tensor_shape 的第一个维度设置为“未知”。最后一个维度固定为 RGB 通道的数字 3
。 height
和 width
维度固定为输入图像的预期大小。(未来的工作可能会为完全卷积模块取消该限制。)
模块的使用者不应直接检查形状,而应通过对模块或模块规范调用 hub.get_expected_image_size() 来获取大小信息,并且应相应地调整输入图像的大小(通常在批处理之前/期间)。
为简单起见,TF-Hub 模块使用张量的 channels_last
(或 NHWC
)布局,并将其留给 TensorFlow 的图形优化器来重写为 channels_first
(或 NCHW
)(如果需要)。自 TensorFlow 1.7 版本以来,它一直默认执行此操作。