web-dev-qa-db-fra.com

eval () et run () dans tensorflow

Je fais référence au tutoriel Deep MNIST for Experts donné par le tensorflow. J'ai un problème dans Former et évaluer une partie de ce tutoriel. Là, ils ont donné un exemple de code comme suit.

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv),reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
sess.run(tf.initialize_all_variables())
for i in range(20000):
  batch = mnist.train.next_batch(50)
  if i%100 == 0:
    train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0})
    print("step %d, training accuracy %g"%(i, train_accuracy))
  train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

print("test accuracy %g"%accuracy.eval(feed_dict={x: mnist.test.images,
                       y_: mnist.test.labels, keep_prob: 1.0}))

Donc, dans ces segments de code, ils ont utilisé accuracy.eval() en même temps. Et autre fois train_step.run(). Comme je sais, les deux sont des variables tensorielles.

Et dans certains cas, j'ai vu comme

sess.run(variable, feed_dict)

Ma question est donc quelles sont les différences entre ces 3 implémentations. Et comment savoir quoi utiliser quand ..?

Merci!!

14
Ramesh-X

Si vous n'avez qu'une seule session par défaut, ce sont essentiellement les mêmes.

De https://github.com/tensorflow/tensorflow/blob/v1.12.0/tensorflow/python/framework/ops.py#L2351 :

op.run () est un raccourci pour appeler tf.get_default_session (). run (op)

De https://github.com/tensorflow/tensorflow/blob/v1.12.0/tensorflow/python/framework/ops.py#L691 :

t.eval () est un raccourci pour appeler tf.get_default_session (). run (t)

Différence entre le tenseur et le fonctionnement:

Tenseur: https://www.tensorflow.org/api_docs/python/tf/Tensor

Opération: https://www.tensorflow.org/api_docs/python/tf/Operation

Remarque: la classe Tensor sera remplacée par Output à l'avenir. Actuellement, ces deux sont des alias l'un pour l'autre.

21
fwalch

La différence réside dans les opérations par rapport aux tenseurs. Les opérations utilisent run () et les tenseurs utilisent eval ().

Il semble y avoir une référence à cette question dans la FAQ TensorFlow: https://www.tensorflow.org/programmers_guide/faq#running_a_tensorflow_computation

La section aborde la question suivante: Quelle est la différence entre Session.run () et Tensor.eval ()?

3
idnavid