首页 文章

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

提问于
浏览
-1

我是张量流的初学者,并 Build 了一个模型来对名称进行分类 . 乍一看,虽然精度仍然太低(~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

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

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

    确实解决了这个问题 .

相关问题