【问题标题】:Turn is_training of batchnorm(TensorFlow) to False将 batchnorm(TensorFlow) 的 is_training 转为 False
【发布时间】:2018-03-11 22:05:01
【问题描述】:

我想在训练后将模型的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')

#......
#after training

saver = tf.train.Saver()
saver.save(sess, 'reshape_final.ckpt')
tf.train.write_graph(sess.graph.as_graph_def(), "", 'graph_final.pb')

保存后如何将batchnorm的is_training转为False

我尝试了tensorflow batchnorm turn of trainingtensorflow change state之类的关键字,但不知道怎么做。

编辑 1:

感谢@Maxim 解决方案,它可以工作,但是当我尝试冻结图形时,又出现了另一个问题。

命令:

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/BiasAdd

python3 ~/.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后,弹出错误消息

“您必须使用 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)

【问题讨论】:

    标签: python machine-learning tensorflow deep-learning conv-neural-network


    【解决方案1】:

    您应该为模式定义一个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')
    ...
    
    # training (phase = 1)
    sess.run([loss, accuracy], 
             feed_dict={'x:0': mnist.train.images,
                        'y:0': mnist.train.labels,
                        'phase:0': 1})
    ...
    
    # testing (phase = 0)
    sess.run([loss, accuracy],
             feed_dict={'x:0': mnist.test.images,
                        'y:0': mnist.test.labels,
                        'phase:0': 0})
    

    你可以在this post找到完整的代码。

    【讨论】:

    • 谢谢,但我不能将此解决方案与 transform_graph 一起使用
    • @Maxim 我编辑了我的问题,你能帮帮我吗?谢谢
    • 你试过fold_batch_normsstrip_unused_nodes吗? github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/…
    • @Maxim 谢谢,但它仍然给我同样的错误信息,这次我添加了'fold_batch_norms fold_old_batch_norms',或者'fold_batch_norms',或者'fold_old_batch_norms',他们每个人都不起作用
    • @Maxim 将占位符更改为变量可以工作,但转换后的图形无法由 opencv dnn 加载,我猜这是 opencv dnn 但不是 tensorflow 的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2018-02-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多