具有多个输入的Google AI平台自定义预测例程,如何读取json输入

时间:2020-04-05 10:14:01

标签: google-cloud-platform google-cloud-ml

对于使用Keras(Tensorflow 2.1)模型创建自定义预测例程,我很难弄清json输入的形式是什么,以及如何在预测器类中读取多个输入。文档中的所有自定义预测例程示例均使用简单的平面单输入列表。例如,如果我们输入以下内容:

{"instances": [
    {
    "event_type_input": [1, 2, 20],
    "event_dwelltime_input": [1.368, 0.017, 0.0],
    "rf_input": [1.2, -2.8]},
    {
    "event_type_input": [14, 40, 20],
    "event_dwelltime_input": [1.758, 13.392, 0.0],
    "rf_input": [1.29, -2.87]}
]}

我们应该如何将传入的json提取到我们的预测变量类中?

class MyPredictor(object):
  def __init__(self, model):
    self.model = model

  def predict(self, instances, **kwargs):
    inputs = np.array(instances) 
    # The above example from the docs is wrong for multiple inputs
    # What should our inputs be to get the inputs in the right shape 
    # for our keras model?

    outputs = self.model.predict(inputs)
    return outputs.tolist()

我们对google ai平台的json输入是字典列表。但是,对于keras模型,我们的输入需要采用不同的形状,如下所示:

inputs = {
    "event_type_input": np.array([[1, 2, 20], [14, 40, 20]]),
    "event_dwelltime_input": np.array([[1.368, 0.017, 0.0], [1.758, 13.392, 0.0]])
    "rf_input": np.array([[1.2, -2.8], [1.29, -2.87]]}
model.predict(inputs)

我是正确的,然后要做的就是重塑实例吗?唯一的困惑是,如果使用tensorflow框架(而不是自定义的预测例程),它可以很好地处理json输入的预测,我认为所有tensorflow框架正在做的就是在实例上调用.predict方法(除非确实数据在后台进行了一些重塑。我找不到源来查明到底发生了什么事

主要问题:我们应该如何编写预测变量类以接收实例,以便可以在其上运行model.predict方法?

1 个答案:

答案 0 :(得分:0)

我建议创建一个新的Keras模型并导出。

为新模型的三个输入中的每个输入创建一个单独的输入层(输入的名称为JSON结构中的名称)。然后,在此模型中,调整输入的形状,并从训练有素的模型中借用权重/结构,然后导出新模型。像这样:

trained_model = keras.models.load_model(...) # trained model
input1 = keras.Input(..., name='event_type_input')
input2 = keras.Input(..., name='event_dwelltime_input')
input3 = keras.Input(..., name='rf_input')
export_inputs = keras.concatenate([input1, input2, input3])
reshaped_inputs = keras.layers.Lambda(...) # reshape to what the first hidden layer of your trained model expects

layer1 = trained_model.get_layer(index=1)(reshaped_inputs)
layer2 = trained_model.get_layer(index=2)(layer1) # etc. ...
...

exportModel = keras.Model(export_inputs, export_output) 
exportModel.save(...)