2015-11-10 26 views
131

Używam wstępny przykład mnożenia macierzy w TensorFlow.Jak wydrukować wartość obiektu Tensor w TensorFlow?

matrix1 = tf.constant([[3., 3.]]) 
matrix2 = tf.constant([[2.],[2.]]) 
product = tf.matmul(matrix1, matrix2) 

Kiedy wydrukować produktu, wyświetla go jako Tensor obiektu:

<tensorflow.python.framework.ops.Tensor object at 0x10470fcd0> 

Ale skąd mam wiedzieć, wartość product?

Poniższa nie pomaga:

print product 
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32) 

wiem, że wykresy uruchomić na Sessions, ale nie jest jakiś sposób mogę sprawdzić dane wyjściowe Tensor obiektu bez uruchamiania wykres w session?

Odpowiedz

134

Najprostszym sposobem oceny * rzeczywistą wartość Tensor przedmiotu jest przekazanie go do sposobu Session.run() lub zadzwoń Tensor.eval() gdy masz domyślnej sesji (czyli w with tf.Session(): bloku, lub patrz poniżej). Ogólnie rzecz biorąc, ** nie można wydrukować wartości tensora bez uruchamiania kodu w sesji.

Jeśli eksperymentują z modelem programowania i chcą w łatwy sposób ocenić tensory The tf.InteractiveSession pozwala otworzyć sesję na początku programu, a następnie wykorzystać tę sesję dla wszystkich Tensor.eval() (i Operation.run()) wywołuje. Może to być łatwiejsze w interaktywnym ustawieniu, takim jak powłoka lub notatnik IPython, kiedy nużące jest omijanie obiektu Session wszędzie.

To może wydawać się głupie na takie małe wyrażenie, ale jednym z kluczowych pomysłów w Tensorflow jest odroczona realizacja: bardzo tanie jest budowanie dużego i złożonego wyrażenia, a gdy chcesz je ocenić, koniec (do którego łączysz się z Session) jest w stanie efektywniej zaplanować jego wykonanie (np. wykonywanie niezależnych części równolegle i za pomocą GPU).


*   Aby wydrukować wartości tensora bez wpuszczeniem go do swojego programu Pythona, można użyć operatora tf.Print(), jak Andrzej suggests in another answer. Zauważ, że nadal musisz uruchomić część wykresu, aby zobaczyć wyjście tego op, które jest drukowane na standardowe wyjście. Jeśli używasz rozproszonego TensorFlow, tf.Print() wydrukuje swoje wyjście na standardowe wyjście zadania, w którym działa op.

**   Ty może móc korzystać z funkcji eksperymentalnej tf.contrib.util.constant_value() aby uzyskać wartość stałej tensora, ale to nie jest przeznaczone do ogólnego użytku, i to nie jest zdefiniowana dla wielu operatorów.

+8

Możliwe jest uzyskanie niektórych atrybutów Tensora bez wywoływania Session.run(). Na przykład możesz wywołać tensor.get_shape(). W wielu przypadkach daje to wystarczającą ilość informacji do debugowania. –

+3

Zobacz także A odpowiedź na temat tf.Print op poniżej. Ciągle znajduję tę odpowiedź stackoverflow podczas googling dla "tensorflow print" i ta górna odpowiedź sprawia, że ​​brzmi jak nie ma tf.Print op. –

+1

Dodałem kilka zastrzeżeń do odpowiedzi, więc teraz powinno być jaśniej. (Nie sądzę, żeby oryginalny pytający był zainteresowany uzyskaniem kształtu tensora, tylko wartością). – mrry

15

Nie, nie można zobaczyć zawartości tensora bez uruchamiania wykresu (wykonanie session.run()).Jedyne rzeczy, które można zobaczyć są:

  • wymiarowości tensora (ale zakładam, że nie jest trudno go obliczyć dla list of the operations że TF)
  • typu operacji, które zostaną użyte do wygenerowania tensor (transpose_1:0, random_uniform:0)
  • typ elementów w tensora (float32)

nie znalazłem tego w dokumentacji, ale wierzę, że wartości zmiennych (i niektóre ze stałych nie są obliczane w momencie cesji).


Spójrz na ten przykład:

import tensorflow as tf 
from datetime import datetime 
dim = 7000 

Pierwszym przykładem, gdzie tylko zainicjowanie stałej tensor liczb losowych prowadzonym w przybliżeniu ten sam czas irrespectibly nikłej (0:00:00.003261)

startTime = datetime.now() 
m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) 
print datetime.now() - startTime 

W drugim przypadku, gdy stała jest faktycznie obliczana, a wartości są przypisane, czas wyraźnie zależy od dim (0:00:01.244642)

startTime = datetime.now() 
m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) 
sess = tf.Session() 
sess.run(m1) 
print datetime.now() - startTime 

I można uczynić go bardziej jasne, obliczając coś (d = tf.matrix_determinant(m1), pamiętając, że czas będzie działał w O(dim^2.8))

PS: Znalazłem było to wyjaśnione w documentation:

tensora przedmiot jest symbolicznym uchwyt do wyniku operacji, ale faktycznie nie posiadają wartości wyjściu operacja jest.

101

Podczas gdy inne odpowiedzi są poprawne, że nie można wydrukować wartości, dopóki nie ocenisz wykresu, nie mówią one o jednym prostym sposobie drukowania wartości wewnątrz wykresu, po jej ocenieniu.

Najprostszym sposobem, aby zobaczyć wartość tensora gdy wykres jest oceniany (przy użyciu run lub eval) jest użycie operacji Print jak w poniższym przykładzie:

# Initialize session 
import tensorflow as tf 
sess = tf.InteractiveSession() 

# Some tensor we want to print the value of 
a = tf.constant([1.0, 3.0]) 

# Add print operation 
a = tf.Print(a, [a], message="This is a: ") 

# Add more elements of the graph using a 
b = tf.add(a, a) 

Teraz, gdy oceniamy całość wykres, np stosując b.eval(), otrzymujemy:

I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3] 
+18

jest BARDZO Ważne, aby użyć a od a = tf.print do czegoś innego! tf.print (a, [a]) nic nie zrobi –

+1

Możemy po prostu użyć 'a.eval()', a następnie! –

17

podkreślenie tego, co mówili inni, to nie można sprawdzić wartości bez uruchamiania wykres.

Prosty fragment dla każdego, kto szuka łatwego przykładu drukowania wartości, jest poniżej.Kod może być wykonany bez żadnych modyfikacji w ipython notebooka

import tensorflow as tf 

#define a variable to hold normal random values 
normal_rv = tf.Variable(tf.truncated_normal([2,3],stddev = 0.1)) 

#initialize the variable 
init_op = tf.initialize_all_variables() 

#run the graph 
with tf.Session() as sess: 
    sess.run(init_op) #execute init_op 
    #print the random values that we sample 
    print (sess.run(normal_rv)) 

wyjściowa:

[[-0.16702934 0.07173464 -0.04512421] 
[-0.02265321 0.06509651 -0.01419079]] 
+2

Tylko FYI: 'OSTRZEŻENIE: tensorflow: From : 1: initialize_all_variables (z tensorflow.python.ops.variables) jest przestarzałe i zostanie usunięte po 2017-03-02. Instrukcje aktualizacji: Zamiast tego użyj "tf.global_variables_initializer". –

6

Na podstawie odpowiedzi powyżej, z danym fragmencie kodu można drukować produkt tak:

import tensorflow as tf 
#Initialize the session 
sess = tf.InteractiveSession() 

matrix1 = tf.constant([[3., 3.]]) 
matrix2 = tf.constant([[2.],[2.]]) 
product = tf.matmul(matrix1, matrix2) 

#print the product 
print(product.eval()) 

#close the session to release resources 
sess.close() 
3

Wypróbuj ten prosty kod! (to jest oczywiste)

import tensorflow as tf 
sess = tf.InteractiveSession() # see the answers above :) 
x = [[1.,2.,1.],[1.,1.,1.]] # a 2D matrix as input to softmax 
y = tf.nn.softmax(x)   # this is the softmax function 
           # you can have anything you like here 
u = y.eval() 
print(u) 
7

Myślę, że trzeba uzyskać pewne podstawy w porządku. Z powyższymi przykładami stworzyłeś tensory (tablica wielowymiarowa). Aby jednak przepływ tensora naprawdę działał, musisz zainicjować "sesję" i uruchomić "sesję" w "operacja". Zwróć uwagę na słowo "sesja" i "operacja". Musisz wiedzieć, 4 rzeczy do pracy z tensorflow:

  1. tensorów
  2. Operacje
  3. Sessions
  4. Wykresy

Teraz z tego co napisałeś się dałeś tensor i operacja, ale nie masz bieżącej sesji ani wykresu. Tensor (krawędzie wykresu) przepływają przez wykresy i są manipulowane przez operacje (węzły wykresu). Istnieje domyślny wykres, ale możesz zainicjować swój w sesji.

Kiedy mówisz "drukuj", uzyskujesz dostęp tylko do kształtu zdefiniowanej zmiennej lub stałej.

Więc widać, czego brakuje:

with tf.Session() as sess:  
      print(sess.run(product)) 
      print (product.eval()) 

Nadzieję, że to pomaga!

2

Należy pamiętać, że tf.Print() zmieni nazwę tensora. Jeśli tensor, który chcesz wydrukować, jest symbolem zastępczym, podawanie danych do niego zakończy się niepowodzeniem, ponieważ oryginalna nazwa nie zostanie znaleziona podczas karmienia. Na przykład:

import tensorflow as tf 
tens = tf.placeholder(tf.float32,[None,2],name="placeholder") 
print(eval("tens")) 
tens = tf.Print(tens,[tens, tf.shape(tens)],summarize=10,message="tens:") 
print(eval("tens")) 
res = tens + tens 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

print(sess.run(res)) 

wyjściowa wynosi:

python test.py 
Tensor("placeholder:0", shape=(?, 2), dtype=float32) 
Tensor("Print:0", shape=(?, 2), dtype=float32) 
Traceback (most recent call last): 
[...] 
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'placeholder' with dtype float 
4

Trzeba myśleć o programach TensorFlow bazowa składająca się z dwóch odrębnych części:

  • Budowanie obliczeniowej wykres.
  • Uruchomienie wykresu obliczeniowego.

Tak więc dla poniższego kodu wystarczy Zbudować wykres obliczeniowy.

matrix1 = tf.constant([[3., 3.]]) 
matrix2 = tf.constant([[2.],[2.]]) 
product = tf.matmul(matrix1, matrix2) 

Trzeba również zainicjować wszystkie zmienne w programie TensorFlow, trzeba jawnie wywołać specjalną operację w następujący sposób:

init = tf.global_variables_initializer() 

Teraz można zbudować wykres i zainicjowany wszystkie zmienne, następnym krokiem jest do oceny węzłów, musisz uruchomić wykres obliczeniowy w ramach sesji. Sesja obejmuje sterowanie i stan środowiska wykonawczego TensorFlow.

Poniższy kod tworzy obiekt sesji, a następnie wywołuje jego metodę run uruchomić dość obliczeniowej wykres, aby ocenić product:

sess = tf.Session() 
// run variables initializer 
sess.run(init) 

print(sess.run([product])) 
2

Można sprawdzić wyjściowe TensorObject bez uruchamiania wykres w sesji , włączając eager execution.

Wystarczy dodać następujące dwa wiersze kodu: import tensorflow.contrib.eager as tfe tfe.enable_eager_execution()

zaraz po was import tensorflow.

Wyjście print product w przykładzie będzie teraz: tf.Tensor([[ 12.]], shape=(1, 1), dtype=float32)

Należy zauważyć, że jak na razie (listopad 2017), będziesz musiał zainstalować Tensorflow nightly zbudować, aby umożliwić wykonanie chętny. Wcześniej zbudowane koła można znaleźć here.