永久性地将常量注入到Tensorflow图中进行推理

时间:2016-11-28 20:17:35

标签: tensorflow tensorflow-serving

我使用is_training的占位符训练模型:

is_training_ph = tf.placeholder(tf.bool)

然而,一旦完成训练和验证,我想永久地为此值注入常量false,然后“重新优化”图形(即使用optimize_for_inference)。是否有freeze_graph的内容可以做到这一点?

1 个答案:

答案 0 :(得分:6)

一种可能性是使用tf.import_graph_def()函数及其with tf.Graph().as_default() as training_graph: # Build model. is_training_ph = tf.placeholder(tf.bool, name="is_training") # ... training_graph_def = training_graph.as_graph_def() with tf.Graph().as_default() as temp_graph: tf.import_graph_def(training_graph_def, input_map={is_training_ph.name: tf.constant(False)}) temp_graph_def = temp_graph.as_graph_def() 参数来重写图中该张量的值。例如,您可以按如下方式构建程序:

temp_graph_def

构建freeze_graph后,您可以将其用作freeze_graph的输入。

可能与optimize_for_inferencegraph_util.convert_variables_to_constants()脚本(对变量名和检查点键进行假设)更兼容的替代方法是修改TensorFlow的def convert_placeholders_to_constants(input_graph_def, placeholder_to_value_map): """Replaces placeholders in the given tf.GraphDef with constant values. Args: input_graph_def: GraphDef object holding the network. placeholder_to_value_map: A map from the names of placeholder tensors in `input_graph_def` to constant values. Returns: GraphDef containing a simplified version of the original. """ output_graph_def = tf.GraphDef() for node in input_graph_def.node: output_node = tf.NodeDef() if node.op == "Placeholder" and node.name in placeholder_to_value_map: output_node.op = "Const" output_node.name = node.name dtype = node.attr["dtype"].type data = np.asarray(placeholder_to_value_map[node.name], dtype=tf.as_dtype(dtype).as_numpy_dtype) output_node.attr["dtype"].type = dtype output_node.attr["value"].CopyFrom(tf.AttrValue( tensor=tf.contrib.util.make_tensor_proto(data, dtype=dtype, shape=data.shape))) else: output_node.CopyFrom(node) output_graph_def.node.extend([output_node]) return output_graph_def 函数,以便它转换占位符代替:

training_graph_def

...然后你可以像上面那样构建temp_graph_def = convert_placeholders_to_constants(training_graph_def, {is_training_ph.op.name: False}) ,然后写:

{{1}}