对于使用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方法?
答案 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(...)