Конвертирование Audioset ckpt в файл pb - PullRequest
1 голос
/ 03 февраля 2020

Я работаю с Audioset / VGGi sh и пытаюсь преобразовать файл контрольных точек , который они предоставляют, в файл .pb. Проблема заключается в том, что для обученной модели предусмотрены только два элемента: файл ckpt (ссылка выше) и файл npz .

. Это мой третий этап попытки сделать это. потратил несколько часов, пытаясь найти лучший инструмент для этого. До сих пор я нашел несколько решений, но все они требуют больше информации, чем просто файл ckpt. Имейте в виду, что файл ckpt и Audioset в целом должны использовать TensorFlow <2. </p>


Примеры:

freeze_graph : я всегда получаю ошибка ValueError: You need to supply the name of a node to --output_node_names независимо от того, какое значение я там ввел. В примере используется softmax, но проблема в том, что я не могу понять, как извлечь имена узлов из файла ckpt, поэтому я не могу добавить действительное значение, не зная их.

Зарегистрированные проблемы GitHub : Следуя коду OP, я получаю ошибку ValueError: No variables to save.

Вопросы о переполнении стека : Этот ответ выглядит как solid, но репозиторий GitHub не предоставляет файл .ckpt.meta. Я полагаю, что мета-информация, как правило, понадобится в некоторых из этих случаев? Я посмотрел вверх, чтобы посмотреть, есть ли способ извлечь мету из файла ckpt для создания метафайла, а затем запустить информацию, поскольку выясняется, что метафайл является структурой или графиком файла ckpt без значений (из этого ответа : Tensorflow: Какая связь между файлом .ckpt и .ckpt.meta и .ckpt.index, и файлом .pb ), но я могу неправильно это понять.

Одна из причин Я подумал, что есть способ извлечь метафайл, из-за этой проблемы кто-то вошел в GitHub MMdnn: Преобразование Audioset VGG из тензорного потока в pytorch . Хотя они и не преобразуются в .pb, в их команде есть файл ckpt.meta. Этот файл не связан в их описании, и поиск в Google по запросу «vggish_model.ckpt.meta» не обнаруживает ничего, кроме проблемы GitHub. Я связался с ОП по этому вопросу, чтобы узнать, смогут ли они пролить свет на то, откуда взялся этот файл.

Предыдущая статья (2018) со сценарием преобразования : это относительно старая статья Я могу заставить скрипт работать, но также получаю ошибку ValueError: No variables to save.


Было бы замечательно, если бы кто-то мог указать мне правильное направление; Я начал исчерпывать свои возможности. Кажется, что есть некоторые хорошие решения, которые я пробую, но я могу просто пропустить один или два шага (или файл или два), чтобы это успешно конвертировать.

Спасибо за помощь!

1 Ответ

1 голос
/ 13 марта 2020

Я надеюсь, что еще не слишком поздно для этого ответа, но мне удалось сгенерировать файлы .pb, используя код вывода, предоставленный в репозитории .

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

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

import vggish_input
from tensorflow.python.tools import freeze_graph
def save(sess, directory, filename, saver):
    """
    This function saves a checkpoint, based on the current session
    """
    if not os.path.exists(directory):
        os.makedirs(directory)
    filepath = os.path.join(directory, filename)
    saver.save(sess, filepath)
    return filepath

def save_as_pb(sess, directory, filename, saver):
    """
    This function saves a checkpoint, then writes the graph in a pbtxt, and then              makes a frozen graph with the chekpoint and the pbtxt
    """

    # Save checkpoint to freeze graph later
    ckpt_filepath = save(sess, directory=directory, filename=filename, saver=saver)
    pbtxt_filename = filename + '.pbtxt'
    pbtxt_filepath = os.path.join(directory, pbtxt_filename)
    pb_filepath = os.path.join(directory, filename + '.pb')

    # This will only save the graph but the variables will not be saved.
    tf.train.write_graph(graph_or_graph_def=sess.graph_def, logdir=directory, name=pbtxt_filename, as_text=True)

    # Freeze graph, combining the checkpoint and 
    freeze_graph.freeze_graph(input_graph=pbtxt_filepath, input_saver='', input_binary=False, input_checkpoint=ckpt_filepath, output_node_names=vggish_params.OUTPUT_TENSOR_NAME.split(':')[0], restore_op_name='save/restore_all', filename_tensor_name='save/Const:0', output_graph=pb_filepath, clear_devices=True, initializer_nodes='')

    return pb_filepath

Затем я вставил save_as_pb сразу после загрузки модели с контрольной точки в vggish_inference_demo.py файле:

  config = tf.ConfigProto()
  config.gpu_options.allow_growth=True
  with tf.Graph().as_default(), tf.Session(config=config) as sess:
    # Define the model in inference mode, load the checkpoint, and
    # locate input and output tensors.
    vggish_slim.define_vggish_slim(training=False)
    vggish_slim.load_vggish_slim_checkpoint(sess, checkpoint)
    features_tensor = sess.graph.get_tensor_by_name(
        vggish_params.INPUT_TENSOR_NAME)
    embedding_tensor = sess.graph.get_tensor_by_name(
        vggish_params.OUTPUT_TENSOR_NAME)
    saver = tf.train.Saver()
    save_as_pb(sess, './saved_vggish/', 'vggish', saver)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...