Я использую модуль обнаружения объектов серии 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 для сохранения полная информация? Что даже является «полным» в этом контексте?