1

Je veux transformer l'état is_training du modèle en False après la formation, comment pourrais-je faire cela?Tour is_training de batchnorm (TensorFlow) à Faux

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

Comment pourrais-je tourner la is_training du batchnorm à False après que je l'enregistrer?

J'ai essayé les mots-clés comme tensorflow tour batchnorm de la formation, changement tensorflow état, mais n'a pas pu savoir comment le faire.

Edit 1:

Merci à la solution @Maxim, cela fonctionne, mais lorsque je tente de geler le graphique, un autre problème se produit.

Commande:

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" 

Après exercerai transform_graph, les messages d'erreur pop out

"Vous devez nourrir une valeur pour 'formation' tenseur d'espace réservé avec DTYPE bool"

I enregistrer le graphique par les codes suivants:

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

Édition 2:

Remplacez l'espace réservé par Variable, mais le graphique après transformé ne peut pas être chargé par opencv dnn.

changement

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

à

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

Répondre

1

Vous devez définir une variable placeholder pour le mode (il peut être booléenne ou une chaîne), et de transmettre des valeurs différentes à session.run lors de la formation et de test. Exemple de code:

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

Vous pouvez trouver le code complet dans this post.

+0

Merci, mais je ne peux pas utiliser cette solution avec transform_graph – Tham

+0

@Maxim Je modifie ma question, pourriez-vous me prêter main? Merci – StereoMatching

+0

Avez-vous essayé 'fold_batch_norms' ou' strip_unused_nodes'? https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md#fold_batch_norms – Maxim