TensorFlow: сохранение / восстановление и смешивание нескольких моделей
Прежде чем идти дальше, обязательно прочтите очень маленький учебник, который я сделал по TF здесь
Зачем начинать с этой информации? Потому что очень важно понимать, что можно сохранить на разных уровнях вашего кода, чтобы избежать бездельничанья ...
Как на самом деле что-то сохранить и загрузить
Объект Saver and Session
Любое взаимодействие с вашей файловой системой для сохранения постоянных данных в TF требует объекта Saver и объекта Session.
Конструктор Saver позволяет управлять многими вещами, среди которых важна 1:
- var_list: по умолчанию
None
, это список переменных, которые вы хотите сохранить в своей файловой системе. Вы можете сохранить все переменные, некоторые переменные или даже словарь, чтобы присвоить переменным собственные имена.
Конструктор Session позволяет управлять тремя вещами:
var_list
: используется в случае распределенной архитектуры для обработки вычислений. Вы можете указать, на каком TF-сервере или «целевом объекте» вы хотите проводить вычисления.- график: график, который должен обрабатывать сеанс. Сложность для новичков заключается в том, что в TF всегда есть график по умолчанию, где все операции установлены по умолчанию, поэтому вы всегда находитесь в «области графика по умолчанию». .
- config: вы можете использовать ConfigProto для настройки TF. Проверьте связанный источник для получения более подробной информации.
Saver может обрабатывать сохранение и загрузку (так называемое восстановление) метаданных графика и данных переменных. Для этого он добавляет операции внутри текущего графика, которые будут оцениваться в течение сеанса .
По умолчанию заставка обрабатывает график по умолчанию и все включенные в него переменные, но вы можете создать столько же Сохранители, так как вы хотите управлять любым графиком или подграфом и их переменными.
Вот пример:
Если вы посмотрите на свою папку, она на самом деле создает 3 файла для каждого вызова сохранения и файл контрольной точки, я расскажу об этом более подробно в приложении. Вы можете продолжать, просто понимая, что веса сохраняются в файлах .data, а ваш график и метаданные сохраняются в файле .meta.
Примечание. Будьте осторожны при использовании заставки с сеансом, связанным с графиком, содержащим все переменные Сохранение обрабатывается. 😨
Вот пример того, как НЕ сохранять переменную:
Восстановление операций и других метаданных
Важной информацией является тот факт, что Saver сохранит все метаданные, связанные с вашим графиком. Это означает, что загрузка контрольной точки .meta также восстановит все пустые переменные, операции и коллекции, связанные с вашим графиком (например, восстановит оптимизатор и его скорость обучения).
Когда вы восстанавливаете мета-контрольную точку, вы фактически загружаете сохраненный график в текущий график по умолчанию. Теперь вы можете получить к нему доступ , чтобы загрузить что-нибудь внутри, например тензор, операцию или коллекцию.
Чтобы восстановить мета-контрольную точку, используйте помощник TF import_meta_graph
:
Восстановление веса
Помните, что фактические реальные веса существуют только в рамках сеанса. Это означает, что у действия «восстановление» должен быть доступ к сеансу для восстановления весов внутри графика. Лучший способ понять операцию восстановления - рассматривать ее просто как своего рода инициализацию. .
Использование предварительно обученного графа в новом графике
Теперь, когда вы знаете, как сохранять и загружать, вы, вероятно, можете понять, как это сделать. Тем не менее, есть некоторые уловки, которые помогут вам двигаться быстрее.
- Может ли результат одного графика быть входом другого графика?
Да, но у этого есть недостаток: я пока не знаю способа облегчить переход градиента между графиками, так как вам нужно будет оценить первый график, получить результаты и передать их на следующий график.
Это может быть нормально, пока вам не понадобится переучивать и первый график. В этом случае вам нужно будет захватить входные градиенты, чтобы передать их на шаг обучения вашего первого графика ...
- Могу ли я смешать все эти разные графики только в одном графике?
Да, но вы должны быть осторожны с пространствами имен. Хорошим моментом является то, что этот метод упрощает все: вы можете загрузить предварительно обученный VGG-16, получить доступ к любым узлам в графе, подключить свои собственные операции и обучить все это!
Если вы хотите настроить только свои собственные узлы, вы можете остановить градиенты в любом месте, чтобы избежать обучения всего графа.
Более близкий пример из реальной жизни
Я сделал полный пример использования Saver в более реалистичной обстановке здесь: https://github.com/metaflow-ai/blog/blob/master/tf-save-load/embedding. ру
Не стесняйтесь запустить код и сами посмотрите, что произойдет.
Приложение: Подробнее об экосистеме данных TF
Мы говорим здесь о Google, и они в основном используют встроенные инструменты для своей работы, поэтому неудивительно, что данные сохраняются в формате ProtoBuff.
Буферы протокола
Буферы протоколов, часто сокращенно называемые Protobuf - это формат, используемый TF для эффективного хранения и передачи данных.
Я не хочу вдаваться в подробности, но считаю его более быстрым форматом JSON, который можно сжать, когда вам нужно сэкономить место / пропускную способность для хранения / передачи. Резюмируя, вы можете использовать Protobufs как:
- Несжатый, удобный текстовый формат с расширением .pbtxt.
- Сжатый, удобный для машины двоичный формат с расширением .pb или без расширения.
Это похоже на использование JSON в настройках разработки и при переходе к производству - сжатие данных на лету для повышения эффективности. С Protobufs можно сделать еще многое, если вам интересно, посмотрите уроки здесь.
Изящный трюк: все операции, связанные с Protobufs в TensorFlow, имеют суффикс «_def», указывающий на «определение буфера протокола». Например, чтобы загрузить Protobufs сохраненного графика, вы можете использовать функцию:
tf.import_graph_def
. А чтобы получить текущий график в виде Protobufs, вы можете использовать:Graph.as_graph_def()
.
Архитектура файлов
Возвращаясь к TF, когда вы сохраняете свои данные обычным способом, вы получаете 5 разных типов файлов:
- Файл контрольной точки
- Некоторые файлы с данными
- «мета» файл.
- индексный файл
- Если вы используете Tensorboard, файл «событий»
- Если вы сбросите удобную для человека версию: файл «текстовых Protobufs».
Давайте сделаем перерыв здесь. Если подумать, что потенциально можно спасти, занимаясь машинным обучением?
Вы можете сохранить архитектуру своей модели и связанные с ней изученные веса. Возможно, вы захотите сохранить некоторые характеристики обучения, такие как потеря и точность вашей модели во время обучения, или даже всю архитектуру обучения. Возможно, вы захотите сохранить гиперпараметры и другие операции, чтобы перезапустить обучение позже или воспроизвести результат. Именно этим занимается TensorFlow.
Три типа файлов контрольных точек предназначены для хранения сжатых данных о ваших моделях и их весах.
- Файл контрольной точки - это просто бухгалтерский файл, который можно использовать в сочетании с высокоуровневым помощником для загрузки файлов chkp, сохраненных в разное время.
- Файл .meta содержит сжатый граф Protobufs вашей модели и все связанные метаданные (коллекции, скорость обучения, операции и т. Д.)
- Файл .index содержит неизменяемую таблицу "ключ-значение", связывающую сериализованное имя тензора и места, где можно найти его данные в файлах chkp.data.
- Файлы .data содержат сами данные (веса) (обычно они довольно большие по размеру). Файлов данных может быть много, потому что они могут быть сегментированы и / или созданы с несколькими временными шагами во время обучения.
- Наконец, файл событий хранит все, что вам нужно для визуализации вашей модели, и все данные, измеренные во время обучения с использованием сводок. Это не имеет ничего общего с сохранением / восстановлением ваших моделей.
Давайте посмотрим на следующий снимок экрана с папкой результатов:
- Имя файла весов следующее:
<prefix>-<global_step>.data-<shard_index>-of-<number_of_shards>
. - Модель была сохранена 2 раза на шагах 250 и 500 только в 1 файл (без осколков).
- Файлы данных намного тяжелее, чем файлы мета, чего и следовало ожидать, поскольку они содержат веса нашей модели.
- Файл index получился очень легким, поскольку это всего лишь таблица "ключ-значение".
TF поставляется с несколькими удобными помощниками, такими как:
- Обработка различных контрольных точек вашей модели во времени и итерациях. Это может быть спасением, если одна из ваших машин сломается до окончания тренировки.
- Разделение веса и метаданных. Вы можете легко поделиться моделью без тренировочного веса.
- Сохранение метаданных позволяет быть уверенным в воспроизведении результата, продолжении тренировки и т. Д.
Чтобы еще больше погрузиться в это: https://www.tensorflow.org/programmers_guide/saved_model
Серия лучших практик TensorFlow
Эта статья является частью более полной серии статей о TensorFlow. Я еще не определил все различные темы этой серии, поэтому, если вы хотите увидеть какую-либо область исследования TensorFlow, добавьте комментарий! Пока что я хотел изучить эти предметы (этот список может быть изменен и не имеет определенного порядка):
- Праймер
- Как работать с формами в TensorFlow
- TensorFlow сохраняет / восстанавливает и смешивает несколько моделей (эта :))
- Как заморозить модель и обслужить ее с помощью Python API
- TensorFlow: Рекомендации по архитектуре файлов, папок и моделей
- TensorFlow howto: универсальный аппроксиматор внутри нейронной сети
- Как оптимизировать конвейер ввода с очередями и многопоточностью
- Мутирующие переменные и поток управления
- Как обрабатывать предварительную обработку с помощью TensorFlow.
- Как управлять градиентами, чтобы создать индивидуальную опору для спины или настроить мои модели.
- Как отслеживать и проверять мои модели, чтобы понять их.
Примечание. TF сейчас быстро развивается, эти статьи в настоящее время написаны для версии 1.0.0.
использованная литература
- Http://stackoverflow.com/questions/38947658/tensorflow-saving-into-loading-a-graph-from-a-file
- Https://stackoverflow.com/questions/41265035/tensorflow-why-there-are-3-files-after-saving-the-model
- Http://stackoverflow.com/questions/34343259/is-there-an-example-on-how-to-generate-protobuf-files-holding-trained-tensorflow?rq=1
- Http://stackoverflow.com/questions/39468640/tensorflow-freeze-graph-py-the-name-save-const0-refers-to-a-tensor-which-doe?rq=1
- Http://stackoverflow.com/questions/33759623/tensorflow-how-to-restore-a-previously-saved-model-python
- Http://stackoverflow.com/questions/34500052/tensorflow-saving-and-restoring-session?noredirect=1&lq=1
- Http://stackoverflow.com/questions/35687678/using-a-pre-trained-word-embedding-word2vec-or-glove-in-tensorflow
- Https://github.com/jtoy/awesome-tensorflow