Обнаружение возражений TF У моделей зоопарка нет обучаемых переменных? - PullRequest
1 голос
/ 11 июня 2019

Модели в TF Objection Detection Zoo имеют файл meta + ckpt, файл Frozen.pb и файл Saved_model.

Я попытался использовать файл meta + ckpt для дальнейшего обучения, а также для извлечения некоторых весов для определенных тензоров для исследовательских целей. Я вижу, что модели не имеют обучаемых переменных.

vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
print(vars)

Приведенный выше фрагмент дает список []. Я также попытался использовать следующее.

vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)
print(vars)

Я снова получаю список [].

Как это возможно? модель лишена переменных? или это tf.Variable(trainable=False)? Где я могу получить файл meta + ckpt с допустимыми переменными. Я специально смотрю на модели SSD + мобилнет

UPDATE:

Ниже приведен фрагмент кода, который я использую для восстановления. Он находится внутри класса, так как я делаю специальный инструмент для некоторого приложения.

def _importer(self):
    sess = tf.InteractiveSession()
    with sess.as_default():
        reader = tf.train.import_meta_graph(self.metafile,
                                            clear_devices=True)
        reader.restore(sess, self.ckptfile)

def _read_graph(self):
    sess = tf.get_default_session()
    with sess.as_default():
        vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
        print(vars)

ОБНОВЛЕНИЕ 2:

Я также попробовал следующий фрагмент. Простой стиль восстановления.

model_dir = 'ssd_mobilenet_v2/'

meta = glob.glob(model_dir+"*.meta")[0]
ckpt = meta.replace('.meta','').strip()

sess = tf.InteractiveSession()
graph = tf.Graph()
with graph.as_default():
    with tf.Session() as sess:
        reader = tf.train.import_meta_graph(meta,clear_devices=True)
        reader.restore(sess,ckpt)

        vari = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
        for var in vari:
            print(var.name,"\n")

Приведенный выше фрагмент кода также дает [] список переменных

1 Ответ

2 голосов
/ 11 июня 2019

После небольшого исследования, окончательный ответ на ваш вопрос ДА .Это вполне очевидно, пока вы не поймете, что каталог variables в saved_model пуст.

Файл контрольных точек, предоставляемый зоопарком модели обнаружения объектов, содержит следующие файлы:

.
|-- checkpoint
|-- frozen_inference_graph.pb
|-- model.ckpt.data-00000-of-00001
|-- model.ckpt.index
|-- model.ckpt.meta
|-- pipeline.config
`-- saved_model
    |-- saved_model.pb
    `-- variables

pipeline.config - это файл конфигурации для сохраненной модели, frozen_inference_graph.pb - для готового вывода.Обратите внимание, что checkpoint, model.ckpt.data-00000-of-00001, model.ckpt.meta и model.ckpt.index все соответствуют контрольной точке .( Здесь вы можете найти хорошее объяснение)

Поэтому, когда вы хотите получить обучаемые переменные, единственное, что полезно - это каталог saved_model.

Используйте SavedModel для сохранения и загрузки вашей модели - переменных, графика и метаданных графика.Это не зависящий от языка, восстанавливаемый, герметичный формат сериализации, который позволяет системам и инструментам более высокого уровня создавать, использовать и преобразовывать модели TensorFlow.

Для восстановления SavedModel вы можете использовать API tf.saved_model.loader.load(), и этот API содержит один аргумент tags, который указывает тип MetaGraphDef.Поэтому, если вы хотите получить обучаемые переменные, вам нужно указать tag_constants.TRAINING при вызове API.

Я попытался вызвать этот API для восстановления переменных, но вместо этого он дал мне ошибку, которая говорит

MetaGraphDef, связанный с тегами train, не найден в SavedModel.Для проверки доступных наборов тегов в SavedModel, пожалуйста, используйте CLI SavedModel: saved_model_cli

Итак, я выполнил команду saved_model_cli для проверки всех тегов, доступных в SavedModel.

#from directory saved_model
saved_model_cli show --dir . --all

и вывод

MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
...
signature_def['serving_default']:
  ...

Таким образом, в этом SavedModel нет тега train, а только serve.Поэтому SavedModel здесь используется только для подачи в тензорный поток.Это означает, что когда эти файлы при создании не были указаны с тегом training, из этих файлов нельзя восстановить тренировочные переменные.

PS: следующий код - это то, что я использовал для восстановления SavedModel.При настройке tag_constants.TRAINING загрузка не может быть завершена, но при установке tag_constants.SERVING загрузка прошла успешно, но переменные пусты.

graph = tf.Graph()
with tf.Session(graph=graph) as sess:
  tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.TRAINING], export_dir)
  variables = graph.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
  print(variables)

PPS: я нашел скрипт для создания SavedModel здесь .Видно, что действительно не было тега train при создании SavedModel.

...