Квантование графика TensorFlow для вывода

Я пытаюсь квантовать свою модель (CNN), чтобы преобразовать ее в квантованную модель .tflite. Я следую руководству по адресу: https://github.com/tensorflow/tensorflow/tree/r1.13/tensorflow/contrib/quantize#quantization-aware-training

Прежде всего, я добавляю фальшивые узлы квантования в свой граф, вызывая:

tf.contrib.quantize.create_training_graph(quant_delay=500)

но затем, когда в конце я пытаюсь вызвать эту функцию, чтобы убедиться, что график экспортируется с информацией о квантовании в правильном формате:

tf.contrib.quantize.create_eval_graph(input_graph=tf.get_default_graph())

Я получаю такую ​​ошибку:

ValueError: Training op found in graph, exiting {'ApplyAdam'}

и действительно, при построении графика я эффективно добавил AdamOptimizer для обучения моей модели:

train_step = tf.train.AdamOptimizer(1e-4).minimize(...)

Как решить эту проблему? Ошибка, кажется, подсказывает, что мне следует удалить оптимизатор Adam, хотя он мне нужен для обучения.

Я не мог найти никакой помощи по этому поводу ни на веб-страницах и в руководствах TensorFlow, ни на других форумах. Я надеюсь ты сможешь мне помочь

заранее спасибо


person Francesco Cariaggi    schedule 21.06.2019    source источник


Ответы (1)


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

Шаг 1)

На графике обучения вы обычно создаете все вплоть до потери, затем вызываете tf.contrib.quantize.create_training_graph(...) перед добавлением своего train_op с оптимизатором. Обучите свою модель, а затем создайте контрольную точку, вы можете делать это через tf.estimator API или просто регулярно в tf.Session.


Шаг 2)

Затем вам нужно создать граф вывода, вы даже не делаете здесь функцию потерь просто частью вашей модели. После этого вызовите tf.contrib.quantize.create_eval_graph(...), чтобы добавить операции квантования. Наконец, вы просто выполняете восстановление из контрольной точки, созданной во время обучения, а затем экспортируете в желаемый формат либо замороженный граф, либо сохраненную модель.


Шаг 3)

Преобразуйте замороженную / сохраненную модель в tflite с помощью toco.

person Yolo Swaggins    schedule 22.06.2019
comment
Удивительно, это сработало! Большое спасибо. Кстати, у меня есть еще одно беспокойство. Поскольку я пытался квантовать игрушечную модель, которую я могу легко обучить с нуля за несколько секунд (всего пара слоев свертки и полностью связанные слои), я фактически пропустил часть тонкой настройки. Но если бы у меня была предварительно обученная модель в формате .pb, смог бы я квантовать ее, используя обучение с учетом квантования, не переобучая ее с нуля и не ставя под угрозу ее точность? Потому что я имею в виду, что для получения информации о квантовании вам все равно нужно передать некоторые обучающие данные в модель, так как это сделать? - person Francesco Cariaggi; 24.06.2019
comment
Если все, что у вас есть, это замороженный граф, я полагаю, можно было бы загрузить его, а затем манипулировать им в строке, но я никогда не пробовал. Что вам нужно сделать, так это проверить, какие операции действительно добавляют tf.contrib.quantize функции, а затем попытаться имитировать их. Я полагаю, что это будет много работы. - person Yolo Swaggins; 25.06.2019
comment
Если у вас есть код для построения графика, гораздо проще построить его заново с нуля с create_*_graph функциями в нужных местах, а затем просто запустить переменные из существующей контрольной точки. Если вы посмотрите в суть, первый train.py скрипт на самом деле не добавляет ничего общего с квантованием. Таким образом, первая контрольная точка имеет только обычные обученные веса без добавления информации о квантовании. - person Yolo Swaggins; 25.06.2019
comment
Привет, теперь tf обновлен до v2, и они удалили contrib, что означает, что квантование исчезло, пожалуйста, я хочу спросить, каковы текущие альтернативы для этих двух функций квантования: create_training_graph и create_eval_graph. Спасибо - person Israel Obanijesu; 15.04.2021