1

Ich möchte den is_training Zustand des Modells zu False nach dem Training, wie könnte ich das tun?Turn is_training von batchnorm (TensorFlow) zu 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') 

Wie konnte ich das is_training des batchnorm zu False nachdem ich speichern Sie es machen?

habe ich versucht, die Schlüsselwörter wie tensorflow batchnorm Wende Ausbildung, Zustand tensorflow Änderung, aber aus nicht finden kann, wie es zu tun.

Edit 1:

Dank @Maxim Lösung, es funktioniert, aber wenn ich versuche, um die Grafik zu gefrieren, ein anderes Problem auftreten.

Befehl:

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" 

Nachdem ich transform_graph ausführen, Fehlermeldungen

herausspringen

"Sie müssen einen Wert für Platzhalter-Tensor-Feed 'Ausbildung' mit D-Typ Bool"

ich die Grafik speichern mit folgenden Codes:

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') 

Bearbeiten 2:

Platzhalter in Variable ändern funktioniert, aber der Graph nach der Transformation kann nicht von opencv dnn geladen werden.

Änderung

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

zu

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

Antwort

1

Sie sollten eine placeholder Variable für den Modus definieren, (es kann boolean oder ein String sein) und andere Werte zu session.run während der Ausbildung und Prüfung übergeben. Beispielcode:

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}) 

Sie können den vollständigen Code in this post finden.

+0

Danke, aber ich kann diese Lösung nicht mit transform_graph verwenden – Tham

+0

@Maxim Ich bearbeite meine Frage, könntest du mir eine Hand geben? Danke – StereoMatching

+0

Hast du 'fold_batch_norms' oder' strip_unused_nodes' versucht? https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md#fold_batch_norms – Maxim

Verwandte Themen