У меня есть модель TF, которая была сохранена с классом tf.train.Saver, и поэтому у меня есть файл .meta, файл data-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 в сеансе, потому что прогнозируемые экземпляры происходят в реальном времени, и поэтому мне нужно использовать функцию, которая поддерживает аргументы.
Я тоже видел этот пост: Повторно использовал график и использовал его несколько раз , но это не помогло моему делу.
Я попытался заморозить график (преобразовав существующий мета-граф в .pb), но это также дало мне ошибку с одной из таблиц поиска, которая у меня есть.И это рассматривается как отдельная проблема на GitHub, и, к сожалению, упомянутый там обходной путь (скорее хак) не сработал для меня.Эта проблема все еще открыта: https://github.com/tensorflow/tensorflow/issues/8665
Я даже установил tf.set_random_seed на постоянное значение во время тренировки, и попытался сделать то же самое для части логического вывода, но безрезультатно.
Так что сейчас я нахожусь в своем уме.
Почему это каждый раз дает мне разные результаты?И есть ли способ загрузить график один раз, а затем продолжать запускать новые экземпляры, не сталкиваясь с проблемой несовместимых выходных данных?