将TensorFlow中批归一化的is_training设置为False

我想在训练后将模型的is_training状态设置为False,该如何操作呢?

net = tf.layers.conv2d(inputs = features, filters = 64, kernel_size = [3, 3], strides = (2, 2), padding = 'same')net = tf.contrib.layers.batch_norm(net, is_training = True)net = tf.nn.relu(net)net = tf.reshape(net, [-1, 64 * 7 * 7]) #net = tf.layers.dense(inputs = net, units = class_num, kernel_initializer = tf.contrib.layers.xavier_initializer(), name = 'regression_output')#......#保存模型后saver = tf.train.Saver()saver.save(sess, 'reshape_final.ckpt')tf.train.write_graph(sess.graph.as_graph_def(), "", 'graph_final.pb')

在保存模型后,我该如何将批归一化的is_training设置为False呢?

我尝试过使用关键词如tensorflow batchnorm turn of trainingtensorflow change state,但没有找到如何操作的方法。

编辑 1:

感谢@***的解决方案,它确实有效,但当我尝试冻结图时,出现了另一个问题。

命令如下:

python3 ~/.keras2/lib/python3.5/site-packages/tensorflow/python/tools/freeze_graph.py --input_graph=graph_final.pb --input_checkpoint=reshape_final.ckpt --output_graph=frozen_graph.pb --output_node_names=regression_output/BiasAddpython3 ~/.keras2/lib/python3.5/site-packages/tensorflow/python/tools/optimize_for_inference.py --input frozen_graph.pb --output opt_graph.pb --frozen_graph True --input_names input --output_names regression_output/BiasAdd~/Qt/3rdLibs/tensorflow/bazel-bin/tensorflow/tools/graph_transforms/transform_graph --in_graph=opt_graph.pb --out_graph=fused_graph.pb --inputs=input --outputs=regression_output/BiasAdd --transforms="fold_constants sort_by_execution_order fold_batch_norms fold_old_batch_norms"

执行transform_graph后,出现了错误信息

“You must feed a value for placeholder tensor ‘training’ with dtype bool”

我是通过以下代码保存图的:

sess.run(loss, feed_dict={features : train_imgs, x : real_delta, training : False})saver = tf.train.Saver()saver.save(sess, 'reshape_final.ckpt')tf.train.write_graph(sess.graph.as_graph_def(), "", 'graph_final.pb')

编辑 2:

将占位符改为变量后有效,但转换后的图无法被opencv dnn加载。

training = tf.placeholder(tf.bool, name='training')

改为

training = tf.Variable(False, name='training', trainable=False)

回答:

您应该为模式定义一个placeholder变量(可以是布尔值或字符串),并在训练和测试期间向session.run传递不同的值。示例代码如下:

x = tf.placeholder('float32', (None, 784), name='x')y = tf.placeholder('float32', (None, 10), name='y')phase = tf.placeholder(tf.bool, name='phase')...# 训练(phase = 1)sess.run([loss, accuracy],          feed_dict={'x:0': mnist.train.images,                    'y:0': mnist.train.labels,                    'phase:0': 1})...# 测试(phase = 0)sess.run([loss, accuracy],         feed_dict={'x:0': mnist.test.images,                    'y:0': mnist.test.labels,                    'phase:0': 0})

您可以在这篇文章中找到完整的代码。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注