предыдущий пост«Разберите и отобразите диаграмму структуры сети из файла модели Tensorflow (модель pb)»как добраться изpbСхема структуры сети извлекается из файла модели и визуализируется.В этой статье описывается, какCKPTСхема структуры сети извлекается из файла модели и визуализируется. Теоретически, поскольку это может бытьpbИзвлеките диаграмму структуры сети из файла модели,CKPTФайлы модели естественно не проблема, но будут некоторые проблемы.
1 Анализ сетевой структуры CKPT
РазобратьCKPTПервым шагом в сетевой структуре является чтениеCKPTФайл диаграммы в модели, получить диаграммуGraphПосле объекта можно получить полную структуру сети. Пример кода для чтения графического файла показан ниже.
saver = tf.train.import_meta_graph(ckpt_path+'.meta',clear_devices=True)
graph = tf.get_default_graph()
with tf.Session( graph=graph) as sess:
sess.run(tf.global_variables_initializer())
saver.restore(sess,ckpt_path)
перечислитьgraph.get_operations()После этого можно получить все вычислительные узлы текущего графа.Operationобъект сTensorОтношение взаимной ссылки между объектами может вывести структуру сети. Однако следует отметить, что сmetaПри получении вычислительных узлов в графе, импортированном в файл, возникают следующие проблемы.
Содержит все узлы для расчета обратного градиентного спуска. Некоторые вычислительные узлы разделены на несколько вычислительных узлов в соответствии с базовыми вычислительными узлами (сложение, вычитание, умножение и деление и т. д.), например,BatchNorm, но на самом деле может быть напрямую объединен в узел.
pbФайл модели может избежать первой описанной выше проблемы, добавивCKPTповорот моделиpbПосле модели вычислительные узлы, связанные с обратным градиентным спуском, могут быть автоматически удалены. Для второго пункта,pbФайл модели автоматически сформирует базовый расчет в расчетный узел, но такие функции, как Slice, не могут быть объединены для операций Tensor. Итак, по 2-му вопросуCKPTповорот моделиpbПосле модели таких проблем можно уменьшить, но нельзя избежать. Полностью избежать этого можно, только нацелившись на себя. После проведенного анализа делается вывод о том, что крайне необходимоCKPTповорот моделиpbМодель.
2 Автоматически преобразовывать CKPT в pb и извлекать узлы в сетевом графе
Если CKPT автоматически преобразуется в модель pb, то предыдущую статью можно использовать повторно.«Разберите и отобразите диаграмму структуры сети из файла модели Tensorflow (модель pb)»код. Пример кода показан ниже.
def read_graph_from_ckpt(ckpt_path,input_names,output_name ):
saver = tf.train.import_meta_graph(ckpt_path+'.meta',clear_devices=True)
graph = tf.get_default_graph()
with tf.Session( graph=graph) as sess:
sess.run(tf.global_variables_initializer())
saver.restore(sess,ckpt_path)
output_tf =graph.get_tensor_by_name(output_name)
pb_graph = tf.graph_util.convert_variables_to_constants( sess, graph.as_graph_def(), [output_tf.op.name])
with tf.Graph().as_default() as g:
tf.import_graph_def(pb_graph, name='')
with tf.Session(graph=g) as sess:
OPS=get_ops_from_pb(g,input_names,output_name)
return OPS
где функцияget_ops_from_pbв предыдущей статье«Разберите и отобразите диаграмму структуры сети из файла модели Tensorflow (модель pb)»был реализован.
3 тест
от«Использование официальной модели предварительного обучения MobileNet V1»Взяв в качестве примера структуру сети MobileNet V1, представленную в этой статье, после загрузки файла MobileNet_v1_1.0_192 и его сжатия мы получаемmobilenet_v1_1.0_192.ckpt.data-00000-of-00001,mobilenet_v1_1.0_192.ckpt.index,mobilenet_v1_1.0_192.ckpt.metaдокумент. нам еще нужно знатьmobilenet_v1_1.0_192.ckptСоответствующий вход и выход моделиTensorИмя объекта не указано в официальном сжатом файле пакета. Один из способов — запустить официальный код и вывести имя входного тензора. Но запуск самого официального кода требует определенного времени и усилий, как описано в предыдущей статье.«Разберите и отобразите диаграмму структуры сети из файла модели Tensorflow (модель pb)»Кодовая реализация исходной сетевой структуры была реализована для записи строки, соответствующей исходной сетевой структуре, вori_network.txtв файле. Таким образом, вы можете заполнить входное имя и выходное имя по желанию, а затем сгенерироватьori_network.txtПосле файла можно визуально увидеть исходную сетевую структуру из файла.ori_network.txtЧасть содержимого файла показана ниже.
Из этого файла видно, что вводTensorназывается:batch:0, выводTensorИмя:MobilenetV1/Predictions/Reshape_1:0. С этой информацией вызовите функциюread_graph_from_ckptПолучить объект списка узлов статического графаops,функция вызоваgen_graph(ops,"save/path/graph.html")После этого в каталогеsave/pathЗалезайgraph.htmlфайл, открытьgraph.htmlПосле этого результат отображения выглядит следующим образом.