我是张量流的初学者,并建立了一个模型来对名称进行分类。乍一看,虽然精度仍然太低(~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
答案 0 :(得分:0)
对于那些和我有同样问题的人来说,这是因为张量名为" output_tensor"是模型中softmax之前的那个。
predictions = tf.nn.softmax(...)
predictions = tf.identity(predictions, "output_tensor")
确实解决了这个问题。