Jeg har brukt det innledende eksemplet på matrisemultiplikasjon i TensorFlow.
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
Når jeg skriver ut produktet, vises det som et Tensor
-objekt:
<tensorflow.python.framework.ops.Tensor object at 0x10470fcd0>
Men hvordan vet jeg verdien av produkt
?
Følgende hjelper ikke:
print product
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32)
Jeg vet at grafer kjører på Sessions
, men er det ikke noen måte jeg kan sjekke utdataene til et Tensor
-objekt uten å kjøre grafen i en session
?
Den enkleste[A] måten å evaluere den faktiske verdien av et Tensor
-objekt er å sende den til Session.run()
-metoden, eller kalle Tensor.eval()
når du har en standard økt (dvs. i en with tf.Session():
-blokk, eller se nedenfor). Generelt[B], kan du ikke skrive ut verdien av en tensor uten å kjøre noe kode i en sesjon.
Hvis du eksperimenterer med programmeringsmodellen, og ønsker en enkel måte å evaluere tensorer på, lar tf.InteractiveSession
deg åpne en sesjon ved starten av programmet ditt, og deretter bruke den sesjonen for alle Tensor.eval()
(og Operation.run()
) kall. Dette kan være enklere i en interaktiv setting, for eksempel skallet eller en IPython-notatbok, når det er kjedelig å sende rundt et Session
-objekt overalt. Følgende fungerer for eksempel i en Jupyter-notatbok:
with tf.Session() as sess: print(product.eval())
Dette kan virke dumt for et så lite uttrykk, men en av nøkkelideene i Tensorflow er utsatt utførelse : det er veldig billig å bygge et stort og komplekst uttrykk, og når du vil evaluere det, er back-end (som du kobler til med en Session
) i stand til å planlegge utførelsen mer effektivt (f.eks. utføre uavhengige deler parallelt og bruke GPUer).
[A]: For å skrive ut verdien av en tensor uten å returnere den til Python-programmet ditt, kan du bruke tf.Print()
operatøren, som Andrzej foreslår i et annet svar. Merk at du fortsatt må kjøre en del av grafen for å se resultatet av denne operasjonen, som skrives ut til standard utdata. Hvis du kjører distribuert TensorFlow, vil tf.Print()
skrive ut utdataene til standardutdataene til oppgaven der denne operasjonen kjøres. Dette betyr at hvis du bruker https://colab.research.google.com for eksempel, eller en hvilken som helst annen Jupyter Notebook, så vil du ikke se utdataene fra tf.Print()
i notatboken; i så fall se dette svaret om hvordan du får den til å skrive ut fortsatt.
[B]: Du kan være i stand til å bruke den eksperimentelle funksjonen tf.contrib.util.constant_value()
for å få verdien av en konstant tensor, men den er ikke ment for generell bruk, og den er ikke definert for mange operatorer.
Mens andre svar har rett i at du ikke kan skrive ut verdien før du evaluerer grafen, snakker de ikke om en enkel måte å faktisk skrive ut en verdi inne i grafen når du har evaluert den.
Den enkleste måten å se en verdi av en tensor når grafen evalueres (ved hjelp av run
eller eval
) er å bruke operasjonen Print
som i dette eksemplet:
# 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)
Når vi nå evaluerer hele grafen, f.eks. ved hjelp av b.eval()
, får vi:
I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3]
Nei, du kan ikke se innholdet i tensoren uten å kjøre grafen (gjøre session.run()
). Det eneste du kan se er:
transpose_1:0
, random_uniform:0
)float32
)Jeg har ikke funnet dette i dokumentasjonen, men jeg tror at verdiene til variablene (og noen av konstantene) ikke beregnes på tildelingstidspunktet.
Ta en titt på dette eksempelet:
import tensorflow as tf
from datetime import datetime
dim = 7000
Det første eksemplet der jeg bare starter en konstant Tensor av tilfeldige tall som kjører omtrent samme tid uavhengig av dim (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
I det andre tilfellet, der konstanten faktisk blir evaluert og verdiene blir tilordnet, avhenger tiden tydelig av 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
Og du kan gjøre det mer tydelig ved å beregne noe (d = tf.matrix_determinant(m1)
, og husk at tiden vil løpe i O(dim^2.8)
)
P.S. Jeg fant hvor det er forklart i dokumentasjon:
Et Tensor-objekt er et symbolsk håndtak til resultatet av en operasjon, men faktisk ikke holde verdiene av operasjonen' s utgang.