keras预处理逻辑

时间:2019-10-05 01:00:19

标签: keras tensorflow-serving

背景

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

问题:

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

我们尝试过

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

有效的是Keras Preprocessing(Python),在客户端如下所述。

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

... grpc调用TensorflowServing ...

我们的目标是使用“ serving_input_receiver_fn”并在TFServing空间中预处理图像,如本博客文章所述: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服务机上进行图像预处理是最佳的。

1 个答案:

答案 0 :(得分:0)

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

  

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

     

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

为什么不将预处理层作为模型图本身的一部分包含在内,以便它可以在Tensorflow服务内运行?