如何保存 Tensorflow 模型(不包含任何变量)以将其移植到 OpenCV 中

How to save a Tensorflow model ( which doesnt contain any variable ) to port it in OpenCV

我想知道保存我在 python 中训练的张量流模型的正确方法是什么,以便我可以使用 opencv 的 dnn 模块将其导入 OpenCV。这是我的 Tensorflow 图

X = tf.placeholder(tf.float32, [None,training_set.shape[1]],name = 'X')
Y = tf.placeholder(tf.float32,[None,training_labels.shape[1]], name = 'Y')

A1 = tf.contrib.layers.fully_connected(X, num_outputs = 50, activation_fn = tf.nn.relu)
A1 = tf.nn.dropout(A1, 0.8)
A2 = tf.contrib.layers.fully_connected(A1, num_outputs = 2, activation_fn = None)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = A2, labels = Y))
global_step = tf.Variable(0, trainable=False)
start_learning_rate = 0.001
learning_rate = tf.train.exponential_decay(start_learning_rate, global_step, 100, 0.1, True )
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

如您所见,它不包含任何变量。所以我的问题是这个图应该如何保存在 Tensorflow 中,以便可以使用 cv::dnn::readNetFromTensorflow 加载它。我应该将模型保存为 .pb 还是 .pbtxt 文件。 .pb.pbtxt 是否包含图表以及权重或仅包含图表??。如何在 OpenCV 中同时加载图形和权重 ??.

属于OP posted link的代码贴在这里。 URL 可能会更改、代码已重命名或消失。因此,我已将代码发布到 OP 引用的位置。

I guess a first question is how to save the graph at least to load it in TensorFlow again? Because you need to find a way to restore it. There is some way to do it:

-- 保存

# Save a graph definition (once)
tf.train.write_graph(sess.graph.as_graph_def(), "", "graph.pb")

# Weights initialization
sess.run(tf.global_variables_initializer())

# Training
...

# Save a checkpoint (weights only, no graph definition)
saver = tf.train.Saver()
saver.save(sess, 'tmp.ckpt')

-- 冻结(将图定义与权重合并,删除仅训练节点)

python ~/tensorflow/tensorflow/python/tools/freeze_graph.py \
  --input_graph=graph.pb \
  --input_checkpoint=tmp.ckpt \
  --output_graph=frozen_graph.pb \
  --output_node_names="NameOfOutputNode"

只有在这些步骤之后,您才可以加载 frozen_graph.pb 包含使用 OpenCV 的图形定义和权重。