我正在尝试将使用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模型)不是从经过训练的模型中获得权重吗?我想念什么?