将Keras训练的模型部署到Google Cloud AI平台,仅用于提供预测

时间:2020-06-05 15:44:07

标签: python tensorflow machine-learning keras deep-learning

我正在尝试将使用Keras(从tf 2开始)创建和训练的模型部署到Google Cloud AI平台。我的想法是在我的本地机器上进行训练(我已经做过了),并将其在Google Cloud中仅用于预测,将图像作为b64输入。

这是一个基于resnet50的模型,该模型可使预测作为输入图像(已使用另一组图像进行重新训练)。按照此处How do I get a TensorFlow/Keras model that takes images as input to serve predictions on Cloud ML Engine?的回答,我设法使模型在Google Cloud中运行,基本上我将Keras模型转换为TF估计器:

EXPORT_PATH='tf_savedmodel'

estimator = keras.estimator.model_to_estimator(
    keras_model_path=KERAS_MODEL_PATH)
estimator.export_saved_model(
    EXPORT_PATH,
    serving_input_receiver_fn=serving_input_receiver_fn) 

将此功能用于serving_input_receiver_fn:

HEIGHT = 512
WIDTH = 256
CHANNELS = 3

def serving_input_receiver_fn():

    def decode_and_resize(image_str_tensor):
        """Decodes jpeg string, resizes it and returns a uint8 tensor."""
        image = tf.image.decode_jpeg(image_str_tensor, channels=CHANNELS)
        image = tf.expand_dims(image, 0)
        image = tf.image.resize_bilinear(
         image, [HEIGHT, WIDTH], align_corners=False)
        image = tf.squeeze(image, squeeze_dims=[0])
        image = tf.cast(image, dtype=tf.uint8)
        return image

    # Optional; currently necessary for batch prediction.
    key_input = tf.placeholder(tf.string, shape=[None]) 
    key_output = tf.identity(key_input)

    input_ph = tf.placeholder(tf.string, shape=[None], name='image_binary')
    images_tensor = tf.map_fn(
      decode_and_resize, input_ph, back_prop=False, dtype=tf.uint8)
    images_tensor = tf.image.convert_image_dtype(images_tensor, dtype=tf.float32) 

    return tf.estimator.export.ServingInputReceiver(
     {'resnet50_input': images_tensor},
     {'bytes': input_ph})

问题是我得到的所有预测都几乎相同,并且都指向同一个班级。我在Keras中使用的原始模型效果很好,而且预测看起来确实不同。

我正在创建的估计量(转换Keras模型)不是从经过训练的模型中获得权重吗?我想念什么?

0 个答案:

没有答案