TensorFlow ma dwa sposoby oceny części wykresu: Session.run
na liście zmiennych i Tensor.eval
. Czy jest jakaś różnica między tymi dwoma?
TensorFlow ma dwa sposoby oceny części wykresu: Session.run
na liście zmiennych i Tensor.eval
. Czy jest jakaś różnica między tymi dwoma?
Odpowiedzi:
Jeśli masz Tensor
t, 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 eval
i run
wykona cały wykres od zera. Aby buforować wynik obliczenia, przypisz go do tf.Variable
.
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
tf.multiply(t, u)
i działało dobrze.
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 t
jest Tensor
obiektem, t.eval()
jest skrótem dla sess.run(t)
(gdzie sess
jest 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 with
bloku. 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.
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ę
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()
itf.Tensor.eval()
uzyskać wyniki z sesji, gdzietf.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 dzwonieniatf.get_default_session().run(op)
.
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 ().
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
tf.Tensor.eval()
itf.Session.run()
, ale połączone, sątf.Operation.run()
itf.Tensor.eval()
jak wyjaśniono tutaj