我用tf.keras训练了一个图像分类器,并在训练完成后将模型导出到云中并进行在线预测。
我使用
在本地主机上提供了模型tensorflow_model_server --model_base $PATH_TO_SAVEDMODEL --rest_api_port=9000 --model_name=saved_model
我能够做出预测并获得结果。当我尝试在云中部署模型时,标题出现错误。
问题是,我想将类名称与预测结果进行映射,而我能够通过执行以下操作来实现:
# after i got the label names i convert the variable to a tensor
label_names_tensor = tf.convert_to_tensor(label_names) # shape (5,)
要导出模型,我将使用
tf.saved_model.simple_save(
sess,
"./saved_models/v1",
inputs={'image': model.input},
outputs={'label' : label_names_tensor,'prediction': model.output[0]})
注意:
这在本地有效,我得到了与预测结果对应的类名。
很明显问题出在哪里..我怎样才能使它正常工作并使用预测结果正确映射类名?
我尝试使用重塑功能,但无法正常工作。我想我最终需要这个:
所以我可以这样做:
非常感谢任何帮助
答案 0 :(得分:0)
一些介绍性注释。首先,要求输入的外部尺寸为None
的原因是为了允许涉及输入批处理的优化。输入基于行:每个输入特征向量/矩阵/张量一行。另一个假设是,每个输入行只产生一个输出行。由于输入行数是可变的,所以输出行数也将是可变的。
其结果之一是,没有一种方法可以输出“静态”信息,而无需在每一行中都进行重复。就是说,如果您通常一次只传递一个输入,则不会有任何重复,但是您确实有处理案例的额外开销,就好像有多个输入一样输入/输出行。您可以按如下所示重复标记的行:
batch_size = tf.expand_dims(tf.shape(model.output)[0], [-1])
new_shape = tf.stack([batch_size[0], -1])
label_names_tensor = tf.reshape(tf.expand_dims(tf.tile(label_names, batch_size), [-1]), new_shape)
# ...
tf.saved_model.simple_save(
sess,
"./saved_models/v1",
inputs={'image': model.input},
outputs={'label' : label_names_tensor,'prediction': model.output})