张量流图像重新训练与服务

时间:2017-02-02 03:18:01

标签: tensorflow tensorflow-serving

我正在尝试使用tensorflow服务来提供重新训练的初始图。对于再培训,我正在使用此example。但是,我需要对此图表进行更改,以使其与serving export code一起使用。

由于在tensorflow服务中,您将收到序列化图像作为输入,图形输入应从此开始:

serialized_tf_example = tf.placeholder(tf.string, name='tf_example')
feature_configs = {
    'image/encoded': tf.FixedLenFeature(shape=[], dtype=tf.string),
}
tf_example = tf.parse_example(serialized_tf_example, feature_configs)
jpegs = tf_example['image/encoded']
images = tf.map_fn(preprocess_image, jpegs, dtype=tf.float32)

此图像张量应输入到重新训练的初始图形。但是我不知道是否可以在tensorflow中将一个图形添加到另一个图形中,就像您可以使用placeholder_with_input(已在重新训练代码中完成)轻松追加一样。

graph, bottleneck_tensor, jpeg_data_tensor, resized_image_tensor = (
  create_inception_graph())

理想情况下,在图像重新训练代码中,我会收到一个占位符张量jpeg_input_data。我需要将张量images附加到此占位符张量jpeg_data_tensor并使用导出器将其导出为单个图形,以便可以使用张量流服务来提供它。但是我没有任何tensorflow指令。除了这种方法之外还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

实现目标的一种方法是:

model_path = 'trained/export.pb' 
with tf.Graph().as_default():
    with tf.Session() as sess:       
        with gfile.FastGFile(model_path, 'rb') as f:
            graph_def = tf.GraphDef()
            graph_def.ParseFromString(f.read())
            # Your prepending ops here
            images_placeholder = tf.placeholder(tf.string, name='tf_example')
            ...
            images = tf.map_fn(preprocess_image, jpegs, dtype=tf.float32)
            tf.import_graph_def(graph_def, name='inception', input_map={'ResizeBilinear:0': images})

特别注意input_map参数。 ResizeBilinear:0可能不是您需要的操作的正确名称 - 您可以通过以下方式列出操作:

[n.name for n in tf.get_default_graph().as_graph_def().node]  

我意识到这不是一个完整的答案,也许不是最有效的,但希望它能让你开始。只是单挑,还有this blogpost

答案 1 :(得分:0)

因为你已经重新训练了模型,我假设模型是一个Protobuf,但是你可以把它加载到一个Python对象中并使用一个自定义函数来处理该对象,该函数可以处理批处理或原子操作。

对于你的图形问题,据我所知,当你加载一个tf.Graph()对象时,你只使用那个对象而不能与其他图形一起工作...如果你有另一个图表那么说作为现有Inception-V3 Graph的扩展的图形,您可以轻松地将其添加到自定义图形的计算图形中。