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

时间:2018-09-13 18:27:40

标签: python tensorflow tensorrt

我正在使用新的tf.data.Dataset API,但似乎无法弄清楚如何执行推理。最终,我想将模型转换为TensorRT图并在TX2上运行它,所有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.placeholder的情况下将其输入TensorRT?我可以找到的所有示例都使用tf.placeholder作为输入。 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')

将写出TensorRT可以利用的UFF文件。我遇到的最大问题是:

  1. 我没有意识到optimize_for_inference_lib.optimize_for_inference操作将iterator替换为tf.placeholder
  2. 我不知道要向哪个节点馈送数据以进行评估:您可以将数据馈送到IteratorGetNext节点

0 个答案:

没有答案