我有一个用tf.train.Saver类保存的TF模型,所以我有.meta文件,数据00000-of-00001文件,索引文件和检查点文件。
我将它用于这样的推理:
graph_num = tf.Graph()
with graph_num.as_default():
sess = tf.Session()
with sess.as_default():
new_saver = tf.train.import_meta_graph('{}.meta'.format(model_path), clear_devices=True)
new_saver.restore(sess, ('{}'.format(model_path)))
sess.run(tf.tables_initializer())
arr_placeholder = graph_num.get_operation_by_name('arr_placeholder/inp_array').outputs[0]
str_placeholder = graph_num.get_operation_by_name('str_placeholder/inp_string').outputs[0]
dropout_keep_prob = graph_num.get_operation_by_name('dropout_keep_prob/keep_prob').outputs[0]
logis = graph_num.get_tensor_by_name('logits/preds/BiasAdd:0')
def model_api(input_data):
# ...preprocessing the input_data...
a = sess.run(tf.nn.softmax(logis),
feed_dict={
arr_placeholder:
np.array(list_of_primary_inputs).reshape(len(list_of_primary_inputs), 142),
dropout_keep_prob: 1.0, str_placeholder: place_holder_list
})
return a
到目前为止一直很好,但后来我调用了这样的函数:
tf.reset_default_graph()
result = model_api(test_input_data)
每次我调用它时,它给出了相同测试数据的不同结果。
但是当我再次实例化图形然后调用该函数时,它给了我相同的数字。
这种行为很奇怪,我不想每次想要传入一个新实例时重新加载图形。
我不能在会话中使用for循环,因为要预测的实例是实时的,所以我必须使用支持参数的函数。
我也看过这篇文章:Reuse graph, and use it multiple times但这对我的情况没有帮助。
我尝试冻结图形(将现有元图转换为.pb),但这也给我一个错误,我有一个查找表。这是作为一个单独的问题在GitHub上提交的,不幸的是,那里提到的解决方法(更多的是黑客)对我没有用。该问题仍然存在:https://github.com/tensorflow/tensorflow/issues/8665
我甚至在训练时将tf.set_random_seed设置为常量值,并尝试对推理部分做同样的操作,但无济于事。
所以现在我的智慧结束了。
为什么每次都给我不同的结果?有没有办法加载图一次,然后继续运行新实例而不遇到这个不一致的输出问题?