Keras 预处理逻辑

4

背景:

在GCP上运行的视觉应用程序中,我们正在使用TF Serving。这个应用程序是使用Go语言编写的,它将图片转换为张量并使用gRPC将其发送到TF Serving。

问题:

Golang中的预处理逻辑不如Python中的Keras图像库效果好(推理的准确性受到影响)。部分原因可能是在训练期间使用了Python库。

我们尝试了:

Tensorflow Serving提供了一种引入预处理器的方式,可以在服务容器上运行。但其功能有限(无法与模型一起打包Keras库)。我们尝试了以下两个选项:

有效的方法是在客户端使用Keras预处理(Python)如下所示。

img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))
img_array = tf.keras.preprocessing.image.img_to_array(img)

... 调用 TensorflowServing 的 grpc ...

我们的目标是按照这篇博客文章中所描述的,在 TFServing 空间中使用“serving_input_receiver_fn”预处理图像:https://medium.com/devseed/technical-walkthrough-packaging-ml-models-for-inference-with-tf-serving-2a50f73ce6f8

但是作为“serving_input_receiver_fn”执行的以下代码并不能产生正确的推断结果。

image = tf.image.decode_image(image_str_tensor, channels=CHANNELS                                       dtype=tf.uint8)
image = tf.reshape(image, [HEIGHT, WIDTH, CHANNELS])

我们的目标是在“serving_input_receiver_fn”内部运行以下Keras代码(类似方式),假设我们可以从“grpc”流中加载图像。
img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))
img_array = tf.keras.preprocessing.image.img_to_array(img)

有可能吗?这是一次大规模的部署(70个GPU和2300个CPU),因此每一点性能都很重要。在我们的情况下,TF-Serving机器上的图像预处理是最优的。


这个问题缺乏细节:您使用了哪些Keras预处理函数,以及您如何尝试在Go中复现它们?此外,Keras是开源的:您可以获取您使用的函数代码,并重新实现它们以在本机TensorFlow中使用TF Serving预处理器。 - Lescurel
1个回答

0

我实际上没有答案,但也许可以指向一些资源来帮助你。首先,我认为keras.preprocessing应该相当慢,请查看https://www.tensorflow.org/tutorials/load_data/images并建议构建预处理管道作为tf.data.Dataset管道。

上述keras.preprocessing方法很方便,但有两个缺点:

它很慢。请参见下面的性能部分。它缺乏细粒度控制。它与TensorFlow的其余部分集成不良。要将文件加载为tf.data.Dataset

为什么不将预处理层包含在模型图本身中,以便它将在tensorflow服务内运行?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接