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, добавьте комментарий! Пока что я хотел изучить эти предметы (этот список может быть изменен и не имеет определенного порядка):

Примечание. TF сейчас быстро развивается, эти статьи в настоящее время написаны для версии 1.0.0.

использованная литература