tensorflow - 使用 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] 范围内有多重要?
解决方案
这只是 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 的模型时,预期的预处理步骤将始终记录在模型页面上。
推荐阅读
- sql - MariaDB 表中的所有“KEY”规范是什么?
- flutter - 自定义charts_flutter - 画线 - 显示数据
- java - Android TextWatcher 使用多线程读取 SQL 数据。如何关闭旧线程?
- java - jconsole.exe 防止了 JVM 崩溃
- c# - ASP.NET Core 3.1 Web API - 为不使用它的控制器禁用 Windows 身份验证
- swift - 如何在 Swfit 中使用 UserDefaults 保存和加载 UIimage?
- mongodb - MongoDB中的项目删除文档中的一个级别
- python - Django int() 参数必须是字符串、类似字节的对象或数字,而不是“OrderItem”
- html - CSS Flex - 间距但左对齐元素?
- android - 我想更改启动器 Activity 而不会崩溃我的应用程序并在主屏幕上保留我的应用程序的快捷方式