Tensorflow freeze_graph не может инициализировать local_variables - PullRequest
0 голосов
/ 19 февраля 2019

При замораживании графа с локальной переменной в freeze_graph появляется ошибка, в которой говорится «Попытка использовать неинициализированное значение ...».Рассматриваемая локальная переменная была инициализирована с помощью:

    with tf.variable_scope(tf.get_variable_scope(),reuse=tf.AUTO_REUSE):
        b_init = tf.constant(10.0, shape=[2, 1], dtype="float32",name = 'bi')
        b = tf.get_variable('b',initializer=b_init,collections=[tf.GraphKeys.LOCAL_VARIABLES])

Я могу создать сохраненную модель и запустить сохраненную модель.Однако я пытаюсь заморозить еще один график для оптимизации.Эта ошибка исчезнет, ​​если я уберу флаг 'LOCAL_VARIABLES'.Однако эта переменная затем становится глобальной, что вызывает проблему с перезагрузкой моей контрольной точки (Tensorflow не может найти переменную в контрольной точке).

Обычно я ожидал бы, что freeze_graph инициализирует 'b' с использованием 'b_init'.

Код для воспроизведения вопроса:

import os, sys, json
import tensorflow as tf
from tensorflow.python.lib.io import file_io

from tensorflow.core.framework import variable_pb2
from tensorflow.python.framework import ops
from tensorflow.python.ops import variables
from tensorflow.python.framework.ops import register_proto_function

from tensorflow.python.saved_model import tag_constants
from tensorflow.python.tools import freeze_graph
from tensorflow.python import ops
from tensorflow.tools.graph_transforms import TransformGraph

#flags
tf.app.flags.DEFINE_integer('model_version',1,'Models version number.')
tf.app.flags.DEFINE_string('export_model_dir','../model_batch/versions', 'Directory where model will be exported to')

FLAGS = tf.app.flags.FLAGS

def main(_):
    ''' main function'''
    a = tf.placeholder(dtype = tf.float32, shape = [2,1])

    with tf.variable_scope(tf.get_variable_scope(),reuse=tf.AUTO_REUSE):
        b_init = tf.constant(10.0, shape=[2, 1], dtype="float32",name = 'bi')
        b = tf.get_variable('b',initializer=b_init,collections=[tf.GraphKeys.LOCAL_VARIABLES])

    b = tf.assign(b,a)
    c = []

    for d in range(5):
        b = b * 1.1

    c.append(b)
    c = tf.identity(c,name = 'c')

    init = tf.group(tf.global_variables_initializer(),
                   tf.local_variables_initializer())

    with tf.Session() as sess:

        #init
        sess.run(init)
        print(tf.get_default_graph().get_collection(tf.GraphKeys.LOCAL_VARIABLES))

        #create saved model builder class
        export_path_base = FLAGS.export_model_dir
        export_path = os.path.join(
            tf.compat.as_bytes(export_path_base),
            tf.compat.as_bytes(str(FLAGS.model_version)))

        if tf.gfile.Exists(export_path):
            print ('Removing previous artifacts')
            tf.gfile.DeleteRecursively(export_path)

        #inputs
        tensor_info_a  = tf.saved_model.utils.build_tensor_info(a)

        #outputs
        tensor_info_c = tf.saved_model.utils.build_tensor_info(c)

        print('Exporting trained model to', export_path)
        builder = tf.saved_model.builder.SavedModelBuilder(export_path)

        #define signatures
        prediction_signature = (
            tf.saved_model.signature_def_utils.build_signature_def(
                inputs={'cameras': tensor_info_a},
                outputs = {'depthmap' : tensor_info_c},
                method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))

        builder.add_meta_graph_and_variables(
            sess, [tf.saved_model.tag_constants.SERVING],
            signature_def_map = {'predict_batch': prediction_signature})

        #export model
        builder.save(as_text=True)

        writer = tf.summary.FileWriter("output_batch", sess.graph)
        writer.close()

    #load graph from saved model
    print ('Freezing graph')
    initializer_nodes = ''
    output_node_names = 'c'
    saved_model_dir = os.path.join(FLAGS.export_model_dir,str(FLAGS.model_version))
    output_graph_filename = os.path.join(saved_model_dir,'frozen_graph.pb')

    freeze_graph.freeze_graph(
        input_saved_model_dir=saved_model_dir,
        output_graph=output_graph_filename,
        saved_model_tags = tag_constants.SERVING,
        output_node_names=output_node_names,
        initializer_nodes=initializer_nodes,
        input_graph=None,
        input_saver=False,
        input_binary=False,
        input_checkpoint=None,
        restore_op_name=None,
        filename_tensor_name=None,
        clear_devices=False)

if __name__ == '__main__':
    tf.app.run()

1 Ответ

0 голосов
/ 20 февраля 2019

Я не смог включить local_variables в свой замороженный граф, но я нашел способ обойти.

Первоначальная проблема состояла в том, что моя контрольная точка была создана из графа, который содержал local_variables.К сожалению, замораживание графика привело к ошибке:

Attempting to use uninitialized value...

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

https://stackoverflow.com/a/39142780/6693924

Я могу создать saveModel и заморозить его график.

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