Получение полной тензорной информации в BestExporter, как в замороженном выводе - PullRequest
0 голосов
/ 31 марта 2020

Я использую модуль обнаружения объектов серии tenorflow 1.14, и у меня возник вопрос о сохранении лучшей модели.

Сначала я провел тренировку, глядя на тензорную доску, и когда график полных потерь был довольно стабильно, я ctrl- c прошел обучение, взял последнюю контрольную точку и преобразовал ее, используя предоставленный скрипт export_inference_graph.

Затем я мог бы использовать этот экспортированный график для маркировки изображений:

detection_graph = tf.Graph()
with detection_graph.as_default():
    od_graph_def = tf.compat.v1.GraphDef()
    with tf.io.gfile.GFile(PATH_TO_FROZEN_GRAPH, 'rb') as fid:
        serialized_graph = fid.read()
        od_graph_def.ParseFromString(serialized_graph)
        tf.import_graph_def(od_graph_def, name='')

with detection_graph.as_default():
    with tf.compat.v1.Session(graph=detection_graph) as sess:
        image_tensor = tf.get_default_graph().get_tensor_by_name('image_tensor:0')
        # ... some code later ...
        output_dict = sess.run(tensor_dict,
                               feed_dict={image_tensor: np.expand_dims(tile, 0)})

Но, конечно, я не хочу нажимать Ctrl- c волей-неволей. Итак, я узнал о BestExporter:

exporter = tf.estimator.BestExporter(
    name=exporter_name,
    serving_input_receiver_fn=predict_input_fn,
    event_file_pattern=('eval/*.tfevents.*'
)

И ранняя остановка:

train_spec = tf.estimator.TrainSpec(
    input_fn=train_input_fn,
    max_steps=train_steps,
    hooks=[
        early_stopping.stop_if_no_decrease_hook(
            estimator,
            'loss',
            10000,
            eval_dir=estimator.eval_dir(eval_specs[0].name)
        )
    ]
)

Я успешно добавил это, и после некоторой тренировки он остановился автоматически. Затем я попытался загрузить лучшую сохраненную модель для вывода:

with tf.compat.v1.Session() as sess:
    # load the saved model.pb from its directory
    tf.saved_model.loader.load(sess, ['serve'], PATH_TO_SAVED_MODEL)
    # load the image tensor
    image_tensor = tf.get_default_graph().get_tensor_by_name('image_tensor:0')

Но это дает сбой: KeyError: "The name 'image_tensor:0' refers to a Tensor which does not exist. The operation, 'image_tensor', does not exist in the graph."

Причина этого, скорее всего, состоит в том, что мой Best Saved Model составляет всего 1 МБ , в то время как save_model, который поставляется с export_inference_graph, равен 22 МБ (как и frozen_inference_graph.pb).

Как получить BestExporter для сохранения полная информация? Что даже является «полным» в этом контексте?

...