创建版本失败。模型验证失败:输出的外部尺寸必须未知,'Const_1:0'的外部尺寸为5

时间:2019-03-19 14:11:59

标签: python tensorflow keras google-cloud-ml

我用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]})

注意:

  • model.output的形状为(?,5)
  • model.output [0]的形状为(5,)

这在本地有效,我得到了与预测结果对应的类名。

很明显问题出在哪里..我怎样才能使它正常工作并使用预测结果正确映射类名?

我尝试使用重塑功能,但无法正常工作。我想我最终需要这个:

  • label_names_tensor的形状->(?,5)

所以我可以这样做:

  • -outputs = {'label':label_names_tensor,'prediction':model.output}

非常感谢任何帮助

1 个答案:

答案 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})