使用SavedModelBuilder保存的张量流模型不返回概率(0到1)

时间:2018-02-08 09:02:29

标签: tensorflow neural-network deep-learning

我是张量流的初学者,并建立了一个模型来对名称进行分类。乍一看,虽然精度仍然太低(~92%),但曲线的形状看起来很好(准确度迅速提高,损失迅速下降)。

如果我使用模型在训练后直接进行预测(使用相同的会话),它会按预期返回概率向量(在0和1之间)(因为我在最后一层使用softmax)

n = loader.name2vector("chang lee woo", MAXNAMELEN)
print(n)
sess.run(init)
res = tf.Variable(tf.zeros([NUMCATS]))
print(sess.run(predictions, feed_dict={inputs: [n], keep_prob: 1.0}))

输出结果为:

[0.38823529411764707, 0.40784313725490196, 0.3803921568627451, 0.43137254901960786, 0.403921568627451, 0.12549019607843137, 0.4235294117647059, 0.396078431372549, 0.396078431372549, 0.12549019607843137, 0.4666666666666667, 0.43529411764705883, 0.43529411764705883, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[[0.6989091  0.30109096]]

第一行显示输入数据,第二行显示预测输出为两个概率,每个可能的分类一个。好!

一旦训练阶段完成,我就使用SavedModelBuilder对象保存了模型。

builder = tf.saved_model.builder.SavedModelBuilder(modelDir)
builder.add_meta_graph_and_variables(sess, [tf.saved_model.tag_constants.SERVING])
builder.save()

如果我加载该模型并尝试进行完全相同的预测,如下所示:

 with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.SERVING], modelDir)
    graph = tf.get_default_graph()
    model = graph.get_tensor_by_name("output_tensor:0")
    x = graph.get_tensor_by_name("input_tensor:0")
    kp = graph.get_tensor_by_name("keep_prob:0")
    print(sess.run(model, feed_dict={ x: [n], kp: 1.0}))

我也有两个花车,虽然' argmax'最高值是相同的,它不像我之前那样[0-1]概率:

[[ 0.4435104 -0.3985979]]

其他预测甚至可以返回更高的值,如[[-2.309665 2.3457503]] ...... 这对我来说是一个问题,因为我想知道预测有多强[0.9-0.1]<> [0.51 - 0.49]

(我已尝试在java中使用相同的TF API并且具有完全相同的问题)

使用TF加载模型时这是正常行为吗?任何帮助将不胜感激。

谢谢!

编辑:我正在使用TensorFlow 1.4.0

1 个答案:

答案 0 :(得分:0)

对于那些和我有同样问题的人来说,这是因为张量名为" output_tensor"是模型中softmax之前的那个。

predictions = tf.nn.softmax(...)
predictions = tf.identity(predictions, "output_tensor")

确实解决了这个问题。