W TensorFlow jaka jest różnica między Session.run () a Tensor.eval ()?

204

TensorFlow ma dwa sposoby oceny części wykresu: Session.runna liście zmiennych i Tensor.eval. Czy jest jakaś różnica między tymi dwoma?

Geoffrey Irving
źródło
pełna przestrzeń nazw tf.Tensor.eval()i tf.Session.run(), ale połączone, są tf.Operation.run()i tf.Tensor.eval()jak wyjaśniono tutaj
prosti

Odpowiedzi:

243

Jeśli masz Tensort, dzwonienie t.eval()jest równoważne dzwonieniu tf.get_default_session().run(t).

Możesz ustawić sesję jako domyślną w następujący sposób:

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)

Najważniejszą różnicą jest to, że można użyć sess.run()do pobrania wartości wielu tensorów w tym samym kroku:

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

Zauważ, że każde wywołanie do evali runwykona cały wykres od zera. Aby buforować wynik obliczenia, przypisz go do tf.Variable.

mrry
źródło
czym różni się w drugim przykładzie? Czy to po prostu, że możesz ocenić oddzielne operacje (lub wykresy? Nie jesteś pewien, jaka jest różnica)?
Pinokio
1
czekaj, czy twój przykład faktycznie działa? Próbowałem: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) i ja właśnie skarg od tensorflow że kształty nie pasują do siebie, myślę, bardziej precyzyjnie, że ranga musi wynosić co najmniej 2
Pinokio
@Pinocchio Myślę, że interfejs API zmienił się, ponieważ oryginalna odpowiedź została opublikowana 4 lata temu. Użyłem tf.multiply(t, u)i działało dobrze.
yuqli,
42

Sesja FAQ na temat przepływu tensora zawiera odpowiedź na dokładnie to samo pytanie . Po prostu pójdę naprzód i zostawię to tutaj:


If tjest Tensorobiektem, t.eval()jest skrótem dla sess.run(t)(gdzie sessjest bieżąca domyślna sesja. Dwa następujące fragmenty kodu są równoważne:

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

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

W drugim przykładzie sesja działa jak menedżer kontekstu, co powoduje, że jest instalowana jako sesja domyślna na cały okres istnienia withbloku. Podejście do menedżera kontekstu może prowadzić do bardziej zwięzłego kodu dla prostych przypadków użycia (takich jak testy jednostkowe); jeśli twój kod obsługuje wiele wykresów i sesji, łatwiejsze może być jawne wywołanie Session.run().

Polecam przynajmniej przejrzeć całą sekcję FAQ, ponieważ może to wyjaśnić wiele rzeczy.

Salvador Dali
źródło
2

eval() nie może obsłużyć obiektu listy

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

ale Session.run()może

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

Popraw mnie, jeśli się mylę

Yushin Liu
źródło
1

Najważniejszą rzeczą do zapamiętania:

Jedynym sposobem na uzyskanie stałej, zmiennej (dowolnego wyniku) z TenorFlow jest sesja.

Wiedząc o tym, wszystko inne jest łatwe :

Zarówno tf.Session.run()i tf.Tensor.eval()uzyskać wyniki z sesji, gdzie tf.Tensor.eval()jest skrót do połączeńtf.get_default_session().run(t)


Chciałbym również nakreślić metodę tf.Operation.run()jak tutaj :

Po uruchomieniu wykresu w sesji można wykonać Operację, przekazując go do tf.Session.run(). op.run()to skrót do dzwonienia tf.get_default_session().run(op).

prosti
źródło
0

W tensorflow tworzysz wykresy i przekazujesz wartości do tego wykresu. Graph wykonuje całą ciężką pracę i generuje dane wyjściowe na podstawie konfiguracji dokonanej na wykresie. Teraz Kiedy przekazujesz wartości do wykresu, najpierw musisz utworzyć sesję tensorflow.

tf.Session()

Po zainicjowaniu sesji powinieneś z niej skorzystać, ponieważ wszystkie zmienne i ustawienia są teraz częścią sesji. Istnieją więc dwa sposoby przekazania wartości zewnętrznych do wykresu, aby wykres je zaakceptował. Jednym z nich jest wywołanie .run () podczas korzystania z wykonywanej sesji.

Innym sposobem, który jest w zasadzie skrótem do tego jest użycie .eval (). Powiedziałem skrót, ponieważ pełna forma .eval () to

tf.get_default_session().run(values)

Możesz to sprawdzić samodzielnie. W miejscu values.eval()biegu tf.get_default_session().run(values). Musisz uzyskać takie samo zachowanie.

eval robi użycie domyślnej sesji, a następnie uruchomienie run ().

Sudeep K Rana
źródło
0

Odpowiedź zgodna z Tensorflow 2.x : Konwersja kodu Mrry Tensorflow 2.x (>= 2.0)na rzecz społeczności.

!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
Obsługa Tensorflow
źródło