我想知道保存在python中训练过的tensorflow模型的正确方法是什么,以便可以使用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所引用的位置。



- 救

# 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"

仅在执行这些步骤之后,您才可以使用OpenCV加载Frozen_graph.pb包含图形定义和权重。

10-07 18:58
查看更多