keras预处理逻辑

saa*_*wan 5 keras tensorflow-serving

背景:

\n\n

在 GCP 上的视觉应用程序中,我们使用 TF 服务。使用 TF Serving 的应用程序是用 Go 编写的。该应用程序将图像转换为 Tensor,并使用 gRPC 将其发送到 TF 服务。

\n\n

问题:

\n\n

Golang 中的预处理逻辑不像 Python 中那样工作,使用 Keras 图像库(推理的准确性受到影响)。部分原因可能是训练期间使用了 Python 库。

\n\n

我们尝试了,

\n\n

Tensorflow 服务提供了一种引入可在服务容器上运行的预处理器的方法。它的功能似乎有限(无法将 Keras 库与模型打包)。我们尝试了以下两种选择

\n\n

有效的是 Keras 预处理 (Python),在客户端如下。

\n\n
img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))\nimg_array = tf.keras.preprocessing.image.img_to_array(img)\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 grpc 调用 TensorflowServing...

\n\n

我们的目标是使用 \xe2\x80\x9cserving_input_receiver_fn\xe2\x80\x9d 并在 TFServing 空间中预处理图像,如本博客文章中所述: https ://medium.com/devseed/technical-walkthrough-packaging-ml-models -for-inference-with-tf-serving-2a50f73ce6f8

\n\n

但是以下作为 \xe2\x80\x9cserving_input_receiver_fn\xe2\x80\x9d 执行的代码不会产生正确的推论。

\n\n
image = tf.image.decode_image(image_str_tensor, channels=CHANNELS                                       dtype=tf.uint8)\nimage = tf.reshape(image, [HEIGHT, WIDTH, CHANNELS])\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们的目标是在 \xe2\x80\x9c\xe2\x80\x9cserving_input_receiver_fn\xe2\x80\x9d 中运行以下 Keras 代码(以类似的方式)(假设我们可以从 \xe2\x80\x9cgrpc\ 加载图像) xe2\x80\x9d 流)。

\n\n
img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))\nimg_array = tf.keras.preprocessing.image.img_to_array(img)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

小智 0

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

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

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

为什么不将预处理层作为模型图本身的一部分,以便它可以在张量流服务中运行?