加载一次Tensorflow图并多次使用?

时间:2018-06-12 08:31:25

标签: python session tensorflow

我有一个用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设置为常量值,并尝试对推理部分做同样的操作,但无济于事。

所以现在我的智慧结束了。

为什么每次都给我不同的结果?有没有办法加载图一次,然后继续运行新实例而不遇到这个不一致的输出问题?

0 个答案:

没有答案