Ответ 1
Я пытаюсь использовать tf.saved_model
а также нашел те же tf.saved_model
(тоже) абстрактные. Здесь мой удар по полному ответу на ваши вопросы:
1. signature_def_map
:
а. Формат См. Ответ Tom для Tensorflow: как сохранить/восстановить модель. (Ctrl-F
для "tf.saved_model" - в настоящее время в его ответе используются только фразы по этому вопросу).
б. Мне нужно понять, что вам это обычно нужно. Если вы собираетесь использовать модель, вам необходимо знать входы и выходы графика. Я думаю, что это сродни сигнатуре функции C++: если вы намереваетесь определить функцию после ее вызова или в другом файле C++, вам нужна подпись в вашем основном файле (т.е. Прототип или в файле заголовка).
2. assets_collection
:
format: Не удалось найти четкую документацию, поэтому я пошел в исходный код компоновщика. Похоже, что аргумент является итерабельным из dtype=tf.string
, где каждый Тензор - это путь к каталогу активов. Таким образом, коллекция TensorFlow Graph должна работать. Я предполагаю, что это тег параметров, но из исходного кода я ожидал бы, что list
Python тоже будет работать.
(Вы не спросили, нужно ли вам установить его, но, судя по ответам Зои " Что такое активы в тензорном потоке" и iga, ответьте на касательно касающуюся Tensorflow, обслуживающую: "Нет ресурсов для сохранения/записи" при экспорте моделей, обычно требуется установить.)
3. Метки:
а. Почему список я не знаю, почему вы должны передать список, но вы можете передать список с одним элементом. Например, в моем текущем проекте я использую только тег [tf...tag_constants.SERVING]
.
б. Когда использовать несколько слов, вы используете явное размещение устройств для операций. Возможно, вы хотите сохранить версию процессора и версию графического процессора вашего графического процессора. Очевидно, что вы хотите сохранить обслуживающую версию каждого и сказать, что хотите сохранить контрольные точки обучения. Вы можете использовать тег CPU/GPU и тег тренировки/обслуживания для управления всеми случаями. Документы подсказывают:
Каждый MetaGraphDef, добавленный в SavedModel, должен быть аннотирован указанными тегами. Теги предоставляют средство для идентификации конкретного MetaGraphDef для загрузки и восстановления вместе с общим набором переменных и активов. Эти теги обычно аннотируют MetaGraphDef с его функциональностью (например, службой или обучением) и, необязательно, с конкретными аппаратными аспектами (например, графическим процессором).
с. Столкновение Слишком ленив, чтобы заставить столкновение себя - я вижу два случая, которые нужно было бы адресовать - я пошел в исходный код загрузчика. Внутри def load
вы увидите:
saved_model = _parse_saved_model(export_dir)
found_match = False
for meta_graph_def in saved_model.meta_graphs:
if set(meta_graph_def.meta_info_def.tags) == set(tags):
meta_graph_def_to_load = meta_graph_def
found_match = True
break
if not found_match:
raise RuntimeError(
"MetaGraphDef associated with tags " + str(tags).strip("[]") +
" could not be found in SavedModel. To inspect available tag-sets in"
" the SavedModel, please use the SavedModel CLI: 'saved_model_cli'"
)
Мне кажется, что он ищет точное совпадение. Например, у вас есть metagraph с тегами "GPU" и "Serving" и metagraph с тегом "Обслуживание". Если вы загрузите "Обслуживание", вы получите последний абзац. С другой стороны, скажем, у вас есть metagraph "GPU" и "Serving" и metagraph "CPU" и "Serving". Если вы попытаетесь загрузить "Обслуживание", вы получите сообщение об ошибке. Если вы попытаетесь сохранить два метка с одинаковыми тегами в одной папке, я ожидаю, что вы перезапишете первый. Это не похоже, что код сборки обрабатывает такое столкновение каким-либо особым образом.
4. SavedModel
или tf.train.Saver
:
Это тоже смутило меня. Ответ wicke: Должны ли пользователи TensorFlow использовать SavedModel через контрольную точку или GraphDef? прояснил это для меня. Я брошу свои два цента:
В области локального Python + TensorFlow вы можете сделать tf.train.Saver
делать все. Но это будет стоить вам. Позвольте мне изложить пример использования save-a-training-model-and-deploy. Вам понадобится ваш объект-хранитель. Легче всего настроить его, чтобы сохранить полный график (каждая переменная). Вероятно, вы не хотите сохранять .meta
все время, пока работаете со статическим графиком. Вы должны указать это в своем учебном крюке. Вы можете прочитать об этом на cv-трюках. Когда ваше обучение закончится, вам понадобится преобразовать файл контрольной точки в файл pb
. Это обычно означает очистку текущего графика, восстановление контрольной точки, замораживание переменных до констант с помощью tf.python.framework.graph_util
и запись его с помощью tf.gfile.GFile
. Вы можете прочитать об этом на среде. После этого вы хотите развернуть его на Python. Вам понадобятся входные и выходные имена тензоров - имена строк в графе def. Вы можете прочитать об этом на метафлоу (на самом деле очень хорошее сообщение в блоге для метода tf.train.Saver
). Некоторые операционные узлы позволят вам легко загружать данные в них. Некоторые не так много. Я обычно отказывался от поиска подходящего узла и добавлял tf.reshape
который на самом деле не переписывал ничего в def. Это был мой входной узел ad ad hoc. То же самое для вывода. И, наконец, вы можете развернуть свою модель, по крайней мере, локально в Python.
Или вы можете использовать ответ, который я связал в пункте 1, чтобы выполнить все это с SavedModel
API SavedModel
. Меньше головных болей благодаря ответу Тома. В будущем вы получите больше поддержки и функций, если они когда-либо будут документированы соответствующим образом. Похоже, что проще использовать командную строку (средние ссылки покрывают это с помощью Saver
- выглядит жестко, удачи!). Он практически запекался к новым Оценщикам. И согласно Документам,
SavedModel - это нейтральный по языку, восстанавливаемый, герметичный формат сериализации.
Акцент мой: Похоже, вы можете гораздо легче получить свои обученные модели в растущий API C++.
То, как я это вижу, похоже на API Datasets. Это просто проще, чем по-старому!
Что касается конкретных примеров SavedModel
tf.train.Saver
: если "в принципе, когда вы хотите сохранить или восстановить свою модель" недостаточно ясно для вас: правильное время для его использования в любое время облегчает вашу жизнь, Для меня это выглядит как всегда. Особенно, если вы используете Оценщики, развертывание в C++ или использование командной строки.
Так что мои исследования по вашему вопросу. Или четыре перечисленных вопроса. Эрр, восемь вопросительных знаков. Надеюсь это поможет.