首页 > 解决方案 > 使用 TF hub 中保存的模型提取特征向量

问题描述

我一直在使用来自 TF hub 的不同模型来提取特征向量:

module = hub.load('https://tfhub.dev/google/tf2-preview/inception_v3/feature_vector/4')
features = module(image)

我不太明白应该如何预处理输入图像。集线器的每个模型都有这个通用指令:

输入图像 1 的颜色值应在 [0,1] 范围内,遵循常见的图像输入约定。默认情况下,输入图像的预期尺寸为高 x 宽 = 299 x 299 像素,但其他输入尺寸也是可能的(在限制范围内)。其中“普通图像输入”是指向以下内容的链接:将一批图像作为输入的签名将它们作为 dtype float32 和形状 [batch_size, height, width, 3] 的密集 4-D 张量接受,其元素是像素的 RGB 颜色值归一化为 [0, 1] 范围。这是你从 tf.image.decode_*() 后跟 tf.image.convert_image_dtype(..., tf.float32) 得到的。

这确实是我在网上经常看到的:

image = tf.io.read_file(path)

# Decodes the image to W x H x 3 shape tensor with type of uint8
image = tf.io.decode_jpeg(image, channels=3)

# Resize the image to for model
image = tf.image.resize(image, [model_input_size, model_input_size])

# 1 x model_input_size x model_input_size x 3 tensor with the data type of float32
image = tf.image.convert_image_dtype(image, tf.float32)[tf.newaxis, ...]

但是,颜色值应在 [0,1] 范围内,在这种情况下,颜色在 [0,255] 范围内,应按比例缩小:

image = numpy.array(image) * (1. / 255)

这只是一个常见错误还是 TF 文档不是最新的?

我正在使用 tf.keras.applications 中的模型并在 github 中阅读源代码。我注意到在一些模型(EfficientNet)中,第一层是:

x = layers.Rescaling(1. / 255.)(x)

但在某些模型中没有这样的层,而是一个实用函数将颜色缩放到 [0,1] 范围,例如 tf.keras.applications.mobilenet.preprocess_input。

那么,TF hub 保存的模型图像颜色在 [0,1] 范围内有多重要?

标签: tensorflow

解决方案


这只是 TF Hub 提出的约定:“鼓励用于相同任务的模型实现通用 API,以便模型消费者可以轻松交换它们而无需修改使用它们的代码,即使它们来自不同的发布者”(来自此处) .

正如您所注意到的,google/tf2-preview/inception_v3/feature_vector/4的发布者决定输入图像“预计颜色值在 [0,1] 范围内”,而tensorflow/efficientdet/d1的发布者/1决定向Rescaling模型本身添加一个层,以便可以传递“[a tensor] with values in [0, 255]”。因此,最终取决于发布者如何实施他们的模型。在任何情况下,当使用来自 tfhub.dev 的模型时,预期的预处理步骤将始终记录在模型页面上。


推荐阅读