Tensorflow: изменение работы узла с использованием замороженного графика (редактирование графика) - PullRequest
0 голосов
/ 01 июля 2018

Я хотел бы изменить / изменить операции, используя замороженный график. Например, как показано ниже, измените ops с «upsample2D, чей метод изменения размера ResizeNearestNeighbor» на «upsample2D, чей метод изменения размера ResizeBilinear»

with tf.device('/gpu:0'):
    with tf.gfile.GFile(filename, 'rb') as file:
        serialized_graph = file.read()
        graph_def.ParseFromString(serialized_graph)
        tf.import_graph_def(graph_def, name='')
        graph_replace = tf.contrib.graph_editor.graph_replace
        nodes = graph_def.node
        for node in nodes:
            if "ResizeNearestNeighbor" in node.name :
                print ("===========> ", node.name)
                node.op ="ResizeBilinear"
                # also need to change node name                   
        nodes = graph_def.node
        for node in nodes:
            print (node.name)
        tf.train.write_graph(graph_def, "./", name='modified.pb')

На самом деле вышеприведенный код не работает; Я думаю, что это связано с непредсказуемым типом в nodedef; также, ошибка декодирования google.protobuf.message.DecodeError: Ошибка разбора сообщения при импорте измененного графика

Я думаю, что следующие методы могут работать, но какая-нибудь помощь для этого?

graph_replace = tf.contrib.graph_editor.graph_replace
graph_replace(node, {node.xx: new_node.xx })

или

tf.import_graph_def(graph_def, input_map={node: a new node})

Спасибо

1 Ответ

0 голосов
/ 03 июля 2018

Ваш основной блок кода несколько странный:

  • Вы создаете graph_replace, но никогда не используете его.
  • Вы соответствуете на node.name. Имена могут быть практически любыми. Вы, вероятно, должны соответствовать node.op, который является «типом» операции. Эти имена фиксированы.
  • Вы меняете тип узлов в node.op ="ResizeBilinear". Это не звучит правильно. Это аналогично char a; boom = (uint64) a в C. Нельзя просто изменить «тип» чего-либо.

В общем, изменение GraphDef вручную - плохая идея. Он не является частью общедоступного интерфейса и может измениться в любое время.

Использование graph_editor, вероятно, лучший подход. Вы можете использовать график Transformer и переопределить transform_op_handler. См. Этот тест для базового примера использования Transformer. Вы можете использовать свой обработчик по умолчанию one , который просто копирует узел как есть. Если это помогает, вот место , где используется этот трансформатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...