【问题标题】:Make ML Engine request for image向图像发出 ML Engine 请求
【发布时间】:2019-01-13 00:37:45
【问题描述】:

我正在尝试为我的 ML Engine 模型制定正确的请求。

我明白了

$ gcloud ml-engine predict --model=plantDisease01 --json-instances=request-float32.json  
{
  "error": "Prediction failed: Error during model execution: AbortionError(code=StatusCode.INVALID_ARGUMENT, 
details=\"Matrix size-incompatible: In[0]: [1,50176], In[1]: [25088,256]\n\t [[Node: dense_1_1/MatMul = MatMul[T=DT_FLOAT, _output_shapes=[[?,256]], transpose_a=false, transpose_b=false, _device=\"/job:localhost/replica:0/task:0/device:CPU:0\"](_arg_dense_1_input_1_0_0, dense_1_1/kernel/read)]]\")"
}

我生成了一个示例请求

python -c 'req = []; [req.append(0.2) for i in range(224*224)]; print(req)' &> request-float32.json

我使用以下 sn-p 生成了协议缓冲区版本

# convert keras model to mlengine model
import keras.backend as K
import tensorflow as tf
from keras.models import load_model, Sequential
from tensorflow.python.saved_model import builder as saved_model_builder
from tensorflow.python.saved_model import tag_constants, signature_constants
from tensorflow.python.saved_model.signature_def_utils_impl import predict_signature_def

# reset session
K.clear_session()
sess = tf.Session()
K.set_session(sess)

# disable loading of learning nodes
K.set_learning_phase(0)

# load model
model = load_model('vgg16_no_augmentation.h5')
config = model.get_config()
weights = model.get_weights()
new_Model = Sequential.from_config(config)
new_Model.set_weights(weights)

# export saved model
export_path = 'mlengine-03' + '/export'
builder = saved_model_builder.SavedModelBuilder(export_path)

signature = predict_signature_def(inputs={'foo-input': new_Model.input},
                                  outputs={'serve': new_Model.output})

with K.get_session() as sess:
    builder.add_meta_graph_and_variables(sess=sess,
                                         tags=[tag_constants.SERVING],
                                         signature_def_map={
                        signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature})
    builder.save()

模型是这个https://github.com/ClaudeCoulombe/deep-learning-with-python-notebooks/blob/master/5.3-using-a-pretrained-convnet.ipynb直到单元格6

(我与链接模型略有偏差,它使用 input_dim=4 * 4 * 512,我使用了更大的)

我知道 25088 = 7 * 7 * 512,这就是模型中的 input_dim。但我不确定我应该如何从一个图像转到一个包含 25,088 个浮点数的文件?

【问题讨论】:

  • 这个想法是,您首先将图像通过特征提取器(模型的卷积基础),将这些特征(形状为 7*7*512)存储在您的案例中,然后通过一个分类器。你的代码到底是什么模型?卷积模型,还是分类器?笔记本中的 VGG 模型需要形状 (150, 150, 3) 的图像。假设您尝试从卷积模型请求预测,也许您想用 (224*224*3) 浮点数而不是 (224*224) 填充您的请求 json?
  • 不,输入几乎可以肯定是 7*7*512,因为这就是模型第一层的 input_dim。我认为你是对的,我需要客户端应用程序中的 convolutional_base 副本才能创建推理输入
  • 内核中的第二个示例将 conv_base 集成到模型中,我将尝试使用它。
  • @HarryMoreno 您提到 input_dim 是 25088 并且错误消息清楚地表明它期望输入的大小。您的问题是如何拍摄实际图像并将其转换为具有正确大小的服务的有效 json 请求?
  • 问题是如何制定一个适用于模型的请求。我最终在内核中使用了模型的第二个版本,这允许我们将原始图像发送到模型主机,并且主机可以在输入模型之前对图像进行预处理。

标签: python-3.x numpy keras google-cloud-ml


【解决方案1】:

挑战在于您必须在图像客户端使用卷积基础,然后将提取的特征发送到模型托管服务。

我选择使用将卷积基础集成到模型中的模型版本。然后我创建了一个简单的 api 来运行模型,接受图像上传并在将图像输入模型之前调整其大小。

https://github.com/morenoh149/simple-keras-rest-api/tree/hm-plant-model可见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2016-09-29
    • 2017-11-20
    • 1970-01-01
    • 2018-09-18
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多