TensorFlow में, Session.run () और Tensor.eval () के बीच अंतर क्या है?


204

TensorFlow में ग्राफ़ के भाग का मूल्यांकन करने के दो तरीके हैं: Session.runचर की सूची और Tensor.eval। क्या इन दोनों में अंतर है?


पूर्ण नाम स्थान tf.Tensor.eval()और tf.Session.run(), लेकिन जुड़े हुए हैं tf.Operation.run()और tf.Tensor.eval()जैसा कि यहां
प्रोस्टि

जवाबों:


243

यदि आपके पास एक Tensorटी है, तो कॉलिंग कॉलिंग t.eval()के बराबर है tf.get_default_session().run(t)

आप निम्नानुसार एक सत्र को डिफ़ॉल्ट बना सकते हैं:

t = tf.constant(42.0)
sess = tf.Session()
with sess.as_default():   # or `with sess:` to close on exit
    assert sess is tf.get_default_session()
    assert t.eval() == sess.run(t)

सबसे महत्वपूर्ण अंतर यह है कि आप sess.run()एक ही चरण में कई टेंसरों के मूल्यों को लाने के लिए उपयोग कर सकते हैं :

t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.mul(t, u)
ut = tf.mul(u, t)
with sess.as_default():
   tu.eval()  # runs one step
   ut.eval()  # runs one step
   sess.run([tu, ut])  # evaluates both tensors in a single step

ध्यान दें कि प्रत्येक कॉल स्क्रैच से पूरे ग्राफ़ को निष्पादित evalऔर runनिष्पादित करेगा। एक संगणना के परिणाम को कैश करने के लिए, इसे असाइन करें tf.Variable


दूसरे उदाहरण में क्या अलग है? क्या यह सिर्फ इतना है कि आप अलग-अलग संचालन (या ग्राफ़ का मूल्यांकन कर सकते हैं? निश्चित नहीं है कि अंतर क्या है)?
पिनोचियो

1
रुको, क्या आपका उदाहरण वास्तव में चलता है? मैंने कोशिश की: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) और मुझे टेंसरफ़्लो से शिकायतें मिलीं कि आकृतियाँ मेल नहीं खातीं, मैं अधिक सटीक अनुमान लगाता हूं, कि रैंक कम से कम 2 होनी चाहिए
पिनोचियो

@Pinocchio मुझे लगता है कि एपीआई 4 साल पहले पोस्ट किए गए मूल उत्तर के रूप में बदल गया। मैंने इस्तेमाल किया tf.multiply(t, u)और यह ठीक काम किया।
युक्ली

42

टेंसर प्रवाह पर अक्सर पूछे जाने वाले प्रश्न सत्र में ठीक उसी प्रश्न का उत्तर होता है । मैं अभी आगे जाऊंगा और इसे यहां छोड़ दूंगा:


यदि tकोई Tensorवस्तु है, t.eval()तो शॉर्टहैंड है sess.run(t)(जहां sessवर्तमान डिफ़ॉल्ट सत्र है। कोड के निम्नलिखित दो स्निपेट समतुल्य हैं:

sess = tf.Session()
c = tf.constant(5.0)
print sess.run(c)

c = tf.constant(5.0)
with tf.Session():
  print c.eval()

दूसरे उदाहरण में, सत्र एक संदर्भ प्रबंधक के रूप में कार्य करता है, जिसमें इसे withब्लॉक के जीवनकाल के लिए डिफ़ॉल्ट सत्र के रूप में स्थापित करने का प्रभाव होता है । संदर्भ प्रबंधक दृष्टिकोण सरल उपयोग के मामलों (जैसे यूनिट परीक्षण) के लिए अधिक संक्षिप्त कोड को जन्म दे सकता है; यदि आपका कोड कई ग्राफ़ और सत्रों से संबंधित है, तो यह स्पष्ट कॉल के लिए अधिक सीधा हो सकता है Session.run()

मेरा सुझाव है कि आप कम से कम पूरे एफएक्यू में स्किम करें, क्योंकि यह बहुत सारी चीजों को स्पष्ट कर सकता है।


2

eval() सूची ऑब्जेक्ट को संभाल नहीं सकता

tf.reset_default_graph()

a = tf.Variable(0.2, name="a")
b = tf.Variable(0.3, name="b")
z = tf.constant(0.0, name="z0")
for i in range(100):
    z = a * tf.cos(z + i) + z * tf.sin(b - i)
grad = tf.gradients(z, [a, b])

init = tf.global_variables_initializer()

with tf.Session() as sess:
    init.run()
    print("z:", z.eval())
    print("grad", grad.eval())

लेकिन Session.run()कर सकते हैं

print("grad", sess.run(grad))

अगर मैं ग़लत हूं तो मेरी गलती सुझाएं


1

सबसे महत्वपूर्ण बात याद रखें:

TenorFlow से एक स्थिर, चर (कोई भी परिणाम) प्राप्त करने का एकमात्र तरीका सत्र है।

यह जानना बाकी सब कुछ आसान है :

दोनों सत्र से परिणाम प्राप्त करते हैं tf.Session.run()और कॉलिंग के लिए एक शॉर्टकट हैtf.Tensor.eval()tf.Tensor.eval()tf.get_default_session().run(t)


मैं भी विधि की रूपरेखा तैयार की tf.Operation.run()में के रूप में यहाँ :

ग्राफ को एक सत्र में लॉन्च किए जाने के बाद, एक ऑपरेशन को इसे पारित करके निष्पादित किया जा सकता है tf.Session.run()op.run()कॉल करने के लिए एक शॉर्टकट है tf.get_default_session().run(op)


0

टेंसरफ़्लो में आप ग्राफ़ बनाते हैं और उस ग्राफ़ में मान पास करते हैं। ग्राफ़ सभी हार्डवर्क करता है और ग्राफ़ में आपके द्वारा किए गए कॉन्फ़िगरेशन के आधार पर आउटपुट उत्पन्न करता है। अब जब आप ग्राफ़ में मान पास करते हैं तो सबसे पहले आपको टेंसरफ़्लो सत्र बनाने की आवश्यकता होती है।

tf.Session()

एक बार सत्र शुरू होने के बाद आप उस सत्र का उपयोग करने वाले हैं क्योंकि सभी चर और सेटिंग्स अब सत्र का हिस्सा हैं। इसलिए, बाहरी मानों को ग्राफ़ में पास करने के दो तरीके हैं ताकि ग्राफ़ उन्हें स्वीकार कर ले। जब आप सत्र निष्पादित किए जा रहे हैं तो एक .run () को कॉल करना है।

दूसरा तरीका जो मूल रूप से इसका एक शॉर्टकट है, वह है .eval () का उपयोग करना। मैंने शार्टकट इसलिए कहा क्योंकि .eval () का पूर्ण रूप है

tf.get_default_session().run(values)

आप खुद देख सकते हैं। values.eval()दौड़ने की जगह पर tf.get_default_session().run(values)। आपको वही व्यवहार प्राप्त करना चाहिए।

eval क्या कर रहा है डिफ़ॉल्ट सत्र का उपयोग कर रहा है और फिर रन () निष्पादित कर रहा है।


0

Tensorflow 2.x संगत उत्तर : Tensorflow 2.x (>= 2.0)समुदाय के लाभ के लिए श्री का कोड परिवर्तित करना ।

!pip install tensorflow==2.1
import tensorflow as tf

tf.compat.v1.disable_eager_execution()    

t = tf.constant(42.0)
sess = tf.compat.v1.Session()
with sess.as_default():   # or `with sess:` to close on exit
    assert sess is tf.compat.v1.get_default_session()
    assert t.eval() == sess.run(t)

#The most important difference is that you can use sess.run() to fetch the values of many tensors in the same step:

t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.multiply(t, u)
ut = tf.multiply(u, t)
with sess.as_default():
   tu.eval()  # runs one step
   ut.eval()  # runs one step
   sess.run([tu, ut])  # evaluates both tensors in a single step
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.