Сохранение тензорного потока в / загрузка графика из файла
из того, что я собрал до сих пор, есть несколько различных способов сброса графика TensorFlow в файл, а затем загрузки его в другую программу, но я не смог найти четкие примеры/информацию о том, как они работают. Что я уже знаю это:
- сохраните переменные модели в файле контрольных точек (.ckpt) с помощью
tf.train.Saver()и восстановить их позже (источник) - сохранить модель в a .pb файл и загрузить его обратно в использовании
tf.train.write_graph()иtf.import_graph_def()(источник) - загрузить в модель из a .PB файл, переобучить его, и сбросить его в новый .PB файл с использованием Bazel (источник)
- заморозить график, чтобы сохранить график и веса вместе (источник)
- использовать
as_graph_def()чтобы сохранить модель и для Весов / переменных, сопоставьте их в константы (источник)
однако, я не смог прояснить несколько вопросов относительно этих различных методов:
- Что касается файлов контрольных точек, они сохраняют только обученные веса модели? Могут ли файлы контрольных точек загружаться в новую программу и использоваться для запуска модели, или они просто служат способами сохранения весов в модели в определенное время/этап?
- о
tf.train.write_graph(), веса / переменные также сохраняются? - Что касается Bazel, он может только сохранять / загружать.ПБ файлы для переподготовки? Есть простая команда Bazel просто сбросить график в a .ПБ?
- Что касается замораживания, можно ли загрузить замороженный график с помощью
tf.import_graph_def()? - Android demo для TensorFlow загружается в начальной модели Google от a .файл PB. Если бы я хотел заменить свой собственный .pb file, как я могу это сделать? Мне нужно будет изменить любой собственный код / методы?
- в общем, в чем именно разница между всеми этими методами? Или в более широком смысле, в чем разница между
as_graph_def()/.ckpt/.ПБ?
короче говоря, то, что я ищу, - это метод сохранения как графика (например, различные операции и т. д.), так и его Весов/переменных в файл, который затем можно использовать для загрузки графика и весов в другую программу для использования (не обязательно продолжения/переподготовки).
документация по этой теме не очень проста, поэтому любые ответы/информация будут очень признательны.
2 ответов:
есть много способов подойти к проблеме сохранения модели в TensorFlow, что может сделать ее немного запутанной. Принимая каждый из ваших под-вопросов по очереди:
файлы контрольных точек (созданные, например, путем вызова
saver.save()наtf.train.Saverобъект) содержат только веса, и любые другие переменные, определенные в той же программе. Чтобы использовать их в другой программе, необходимо заново создать связанную структуру графа (например, запустив код, чтобы построить его снова, или вызовtf.import_graph_def()), который говорит TensorFlow, что делать с этими весами. Обратите внимание, что вызовsaver.save()также создает файл, содержащийMetaGraphDef, который содержит график и сведения о том, как связать веса из контрольной точки с этим графиком. Смотрите учебник для более подробной информации.
tf.train.write_graph()только пишет структуру графика; не веса.Bazel не имеет отношения к чтению или записи тензорных графов. (Возможно, я неправильно понял ваш вопрос: не стесняйтесь разъяснять его в комментарии.)
замороженный график может быть загружен с помощью
tf.import_graph_def(). В этом случае веса (как правило) встроены в график, поэтому вам не нужно загружать отдельную контрольную точку.основное изменение будет заключаться в обновлении имен тензора(ов) которые подаются в модель, и имена тензоров, которые извлекаются из модели. В демо-версии TensorFlow для Android это будет соответствовать
inputNameиoutputNameстроки, которые передаются вTensorFlowClassifier.initializeTensorFlow().The
GraphDefэто структура программы, которая обычно не меняется в процессе обучения. Контрольная точка-это моментальный снимок состояния тренировочного процесса, который обычно изменяется на каждом этапе тренировочного процесса. В результате TensorFlow использует различные форматы хранения для этих типов данных, а низкоуровневый API предоставляет различные способы их сохранения и загрузки. Библиотеки более высокого уровня, такие какMetaGraphDefбиблиотеки Keras и skflow построить на этих механизмах, чтобы обеспечить более удобные способы сохранения и восстановления всей модели.
вы можете попробовать следующий код:
with tf.gfile.FastGFile('model/frozen_inference_graph.pb', "rb") as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) g_in = tf.import_graph_def(graph_def, name="") sess = tf.Session(graph=g_in)
Comments