代码之家  ›  专栏  ›  技术社区  ›  John

训练后用占位符交换TensorFlow数据集输入管道

  •  4
  • John  · 技术社区  · 7 年前

    tf.data.Dataset examples I have found 假设你有一个 tf.placeholder 用于输入。下面是我如何训练的伪代码。[…]只是一个占位符,因为我没有实际运行代码。我们不要讨论这个模型,因为它只是举一个例子:

    import tensorflow as tf
    
    # Setup iterator
    datain = tf.data.FixedLengthRecordDataset(datafiles, record_bytes1)
    labels = tf.data.FixedLengthRecordDataset(labelfiles, record_bytes2)
    dataset = tf.data.Dataset.zip((datain, labels))
    dataset = dataset.prefetch(batch_size)
    dataset = dataset.repeat(n_epoch)
    iterator = dataset.make_initializable_iterator()
    
    sess = tf.Session()
    sess.run(iterator.initializer)
    [batch_x, batch_y] = iterator.get_next()
    
    # Define model function (let's not debate model except as relevant to question)
    def model_fn(xin):
        x0 = tf.transpose(tf.reshape(xin, [...], name='input'))
        w = tf.Variable(tf.truncated_normal([...], stddev=0.1))
        x1 = tf.nn.conv2d(x0, w, strides=[...], padding='VALID')
        b = tf.Variable(tf.constant(0.0, shape=[...]))
        x2 = tf.nn.bias_add(x1, b)
        x3 = tf.nn.relu(x2, name='output')
        return x3
    
    # Setup training environment
    model = model_fn(batch_x)
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=model, labels=batch_y))
    optimizer = tf.train.AdamOptimizer(learning_rate=1e-3).minimize(loss)
    
    # Train Model
    while True:
        try:
            sess.run(optimizer)
        except tf.errors.OutOfRangeError:
            break
    
    # Save model
    saver = tf.train.Saver(name='saver')
    saver.save(sess, 'temp/path')
    

    我的问题是,如何在输入不是一个 tf.占位符 ? 我能找到的所有例子 tf.占位符 This example 建议使用 SavedModel 类,但我似乎找不到任何关于如何实现这一点的文档。

    谢谢!

    编辑:这是我的解决方案,感谢下面的帮助

    from tensorflow.python.tools import optimize_for_inference_lib
    import uff
    
    # You can feed data to the IteratorGetNext node using feed_dict
    input_node_name = 'iterator_scope_name/IteratorGetNext'
    output_node_name = 'model_scope_name/output'
    
    # Run inference on the trained model:
    graph = tf.get_default_graph()
    batch_x = graph.get_tensor_by_name(input_node_name + ':0')
    networkout = graph.get_tensor_by_name(output_node_name + ':0')
    testdata, testlabel = custom_data_reader_fn(data_folder)
    # This will evaluate the model
    label = sess.run(networkout, feed_dict={batch_x: testdata})
    
    # Freeze model and create a UFF file:
    graph_def = graph.as_graph_def() # Convert the graph to a serialized pb
    frozen_graph_def = tf.graph_util.convert_variables_to_constants(sess,
        graph_def, [output_node_name])
    opt_graph_def = optimize_for_inference_lib.optimize_for_inference(
        frozen_graph_def, [input_node_name], [output_node_name],
        tf.float32.as_datatype_enum)
    uff.from_tensorflow(opt_graph_def, [output_node_name], quiet=False,
        output_filename='opt_model.uff')
    

    1. 我没有意识到 optimize_for_inference_lib.optimize_for_inference 操作取代了 iterator 用一个
    2. 我不知道将数据馈送到哪个节点进行评估:您可以将数据馈送到 IteratorGetNext 节点
    1 回复  |  直到 7 年前
        1
  •  4
  •   GPhilo satyendra    7 年前

    既然你已经在检查点中保存了一个经过训练的图, 最简单的解决方案是通过导出推理图 optimize_for_inference .

    这个工具既适用于已经冻结的图,也适用于仍然定义了变量的图。 假设您采用冻结图形方式,第一步是通过以下方式将图形的变量转换为常量:

    python freeze_graph.py \
    --input_graph=temp/path/graph.pbtxt \
    --input_checkpoint=temp/path/your_model_name.ckpt \
    --output_graph=frozen_model.pb \
    --output_node_names=name_of_the_output_tensor_you_want_to_use
    

    这将生成一个名为 frozen_model.pb 这是最重要的 Variable 操作替换为 Const 使用从检查点文件加载的值进行操作。

    然后,您需要生成推理图:

    python optimize_for_inference.py \
    --input=frozen_model.pb \
    --output=inference.pb \
    --frozen_graph=True \
    --input_names=IteratorGetNext
    --output_names=name_of_the_output_tensor_you_want_to_use
    

    IteratorGetNext --placeholder_type_enum 选项。在这种情况下,需要从 DataType enum .

    注: Graph Surgeon 或TF的 graph transform tool