我正在尝试使用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指令。除了这种方法之外还有其他选择吗?
答案 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的扩展的图形,您可以轻松地将其添加到自定义图形的计算图形中。