TensorFlow'da bir Tensor nesnesinin değeri nasıl yazdırılır?


259

TensorFlow'da matris çarpımının giriş örneğini kullanıyorum.

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

Ürünü yazdırdığımda, bir Tensornesne olarak görüntüleniyor :

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

Ama değerini nasıl bilebilirim product?

Aşağıdakiler yardımcı olmaz:

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

Grafikler üzerinde çalıştığını biliyorum Sessions, ama grafik bir çalıştırmadan bir Tensornesnenin çıktısını kontrol edebilirsiniz herhangi bir yolu yok sessionmu?

Yanıtlar:


250

Bir nesnenin gerçek değerini değerlendirmenin en kolay [A] yolu, Tensornesneyi Session.run()yönteme iletmek veya Tensor.eval()varsayılan oturumunuz olduğunda (ör. Bir with tf.Session():blokta veya aşağıya bakın) çağırmaktır . Genel olarak [B] , bir oturumda kod çalıştırmadan bir tensörün değerini yazdıramazsınız.

Programlama modeliyle denemeler yapıyorsanız ve tensörleri değerlendirmenin kolay bir yolunu istiyorsanız tf.InteractiveSession, programınızın başlangıcında bir oturum açmanıza ve ardından bu oturumu tüm Tensor.eval()(ve Operation.run()) çağrılar için kullanmanıza izin verir . Kabuk veya IPython dizüstü bilgisayar gibi etkileşimli bir ortamda, Sessionher yerde bir nesnenin etrafından dolaşmak sıkıcı olduğunda bu daha kolay olabilir . Örneğin, Jupyter not defterinde aşağıdakiler çalışır:

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

Bu, küçük bir ifade için aptalca görünebilir, ancak Tensorflow 1.x'teki anahtar fikirlerden biri ertelenmiş yürütmedir : büyük ve karmaşık bir ifade oluşturmak çok ucuzdur ve değerlendirmek istediğinizde, arka uç ( a Session) ile bağlandığınızda, daha verimli bir şekilde çalışmasını programlayabilir (örn. bağımsız parçaları paralel olarak yürütmek ve GPU'ları kullanarak).


[A]: Bir tensörün değerini Python programınıza iade etmeden yazdırmak için, tf.print() , Andrzej'in başka bir cevapta önerdiği gibi operatörü . Resmi belgelere göre:

Operatörün çalıştığından emin olmak için, kullanıcıların üretilen op tf.compat.v1.Sessiontf.compat.v1.control_dependencies([print_op] çıktıya çalıştırma yöntemini , belirtilen) ile çalıştırılan ops için bir kontrol bağımlılığı olarak kullanmaları gerekir .

Ayrıca şunu da unutmayın:

Jupyter defter ve kolablarında, tf.print dizüstü bilgisayar hücre çıktılarına yazdırır. Dizüstü bilgisayar çekirdeğinin konsol günlüklerine yazılmaz.

[B]: Sen belki kullanabilmek için tf.get_static_value()değeri verimli hesaplanabilen ise verilen tensör sabit değerini almak için işlev.


17
Session.run () öğesini çağırmadan bir Tensörün bazı niteliklerini almak mümkündür. Örneğin, tensor.get_shape () öğesini çağırabilirsiniz. Çoğu durumda, bu hata ayıklamak için yeterli bilgi verir.
Ian Goodfellow

5
Ayrıca bkz. And'ın tf.Print op hakkındaki cevabı. Ben "tensorflow baskı" için googling yaparken bu stackoverflow cevap bulmaya devam ve bu üst cevap tf.Print op yok gibi ses yapar.
Ian Goodfellow

2
Cevaba bazı uyarılar ekledim, bu yüzden şimdi daha net olmalı. (Ben orijinal soru soran sadece bir değer bir tensör, şekil almak ilgilendi sanmıyorum.)
mrry

1
Konsola yazdırmak yerine bir dosyaya kaydetmenin bir yolu var mı (tf.Print aracılığıyla)?
thang

tf.Session()Tensorflow 2'de çalışmaz. Bunun tf.compat.v1.Session()yerine kullanabilirsiniz .
mikrofon

158

Grafiği değerlendirinceye kadar değeri yazdıramayacağınız diğer yanıtlar doğruysa da, bir kez değerlendirdiğinizde, grafik içindeki bir değeri yazdırmanın kolay bir yolundan bahsetmezler.

Grafik değerlendirildiğinde ( runveya kullanılarak eval) bir tensörün değerini görmenin en kolay yolu , Printişlemi bu örnekte olduğu gibi kullanmaktır :

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

Şimdi, grafiğin tamamını değerlendirdiğimizde, örneğin kullanarak b.eval():

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

37
a = tf.print'ten başka bir şeye a kullanmanız ÇOK önemlidir! tf.print (a, [a]) başka bir şey yapmaz
Fábio Dias

5
O zaman kullanabiliriz a.eval()!
Udayraj Deshmukh

1
@FabioDias Demek istediğimi anladım mı? Zamanınız olduğunda lütfen biraz özen gösterir misiniz ...
yuqli

7
Lütfen tf.Print()kullanımdan kaldırıldığını ve (şimdi) kaldırıldığını unutmayın. Bunun yerine kullanıntf.print() . Dokümanlara bakın: tensorflow.org/api_docs/python/tf/Print ve tensorflow.org/api_docs/python/tf/print .
Hephaestus

1
vay Sadece bir yıl sonra @yuqli kendi yorum görmek için sürpriz ama şimdi onun noktasını anlıyorum. Bkz bu kullanımdan kaldırılmış API hakkında hala yazı, ama fikirlerin muhtemelen benzerdir.
yuqli

27

Başkalarının söylediklerini yineleyerek, grafiği çalıştırmadan değerleri kontrol etmek mümkün değildir.

Değerleri yazdırmak için kolay bir örnek arayan herkes için basit bir snippet aşağıdaki gibidir. Kod ipython not defterinde herhangi bir değişiklik yapılmadan yürütülebilir.

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

Çıktı:

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

2
Sadece FYI:WARNING:tensorflow:From <ipython-input-25-8583e1c5b3d6>:1: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02. Instructions for updating: Use 'tf.global_variables_initializer' instead.
Mark Cramer

20

Hayır, grafiği çalıştırmadan (yapıyor session.run()) tensörün içeriğini göremezsiniz . Görebileceğiniz tek şey:

  • tensörün boyutsallığı (ancak operasyonların listesi için hesaplamanın zor olmadığını düşünüyorum) TF'nin sahip )
  • tensörü ( transpose_1:0, random_uniform:0) oluşturmak için kullanılacak işlemin türü
  • tensördeki elemanların türü ( float32)

Bunu dokümantasyonda bulamadım, ancak değişkenlerin değerlerinin (ve bazı sabitlerin atama sırasında hesaplanmadığına) inanıyorum.


Bu örneğe bir göz atın:

import tensorflow as tf
from datetime import datetime
dim = 7000

Rasgele sayıların sabit bir Tensörünü başlattığım ilk örnek dim ( 0:00:00.003261) 'den bağımsız olarak yaklaşık olarak aynı zamanda çalışır

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

Sabitin gerçekten değerlendirildiği ve değerlerin atandığı ikinci durumda, zaman açıkça dim ( 0:00:01.244642) 'ye bağlıdır.

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

Ve bir şeyi hesaplayarak daha açık hale getirebilirsiniz ( d = tf.matrix_determinant(m1), zamanın akacağını unutmayın O(dim^2.8))

PS buldum belgelerinde açıklanmıştır :

Bir Tensör nesnesi, bir işlemin sonucuna ilişkin sembolik bir tanıtıcıdır, ancak aslında işlemin çıktısının değerlerini tutmaz.


15

Bence bazı temel ilkeleri doğru yapmalısınız. Yukarıdaki örneklerle tensörler (çok boyutlu dizi) oluşturdunuz. Ancak tensör akışının gerçekten işe yaraması için bir " oturum " başlatmanız ve oturumda " operasyonunuzu " çalıştırmanız gerekir . "Oturum" ve "işlem" kelimelerine dikkat edin. Tensorflow ile çalışmak için 4 şey bilmeniz gerekir:

  1. tansörler
  2. Operasyonlar
  3. Oturumlar
  4. Grafikler

Şimdi yazdıklarınızdan tensör ve operasyon verdiniz, ancak oturumunuz veya grafiğiniz yok. Tensör (grafiğin kenarları) grafikler boyunca akar ve işlemlerle (grafiğin düğümleri) manipüle edilir. Varsayılan grafik var, ancak bir oturumu kendiniz başlatabilirsiniz.

Yazdır dediğinizde, yalnızca tanımladığınız değişken veya sabitin şekline erişirsiniz.

Böylece neyi kaçırdığınızı görebilirsiniz:

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

Umarım yardımcı olur!


13

İçinde Tensorflow 1.x

import tensorflow as tf
tf.enable_eager_execution()
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]

Tensorflow 2.x ile istekli mod varsayılan olarak etkindir. bu nedenle aşağıdaki kod TF2.0 ile çalışır.

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

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]

1
TensorFlow sürüm 1.13.2'yi yükledim ve istekli yürütmeyi etkinleştirdim (tf.executing_eagerly () ile çalışıp çalışmadığını kontrol ettim) ve özel kayıp işlevi içinde tensör değerini değerlendirmeye çalışırken 'Tensor' nesnesinin hiçbir özelliği 'numpy' yok. Sorunu çözmek için herhangi bir yardımı gerçekten takdir ediyorum.
Niko Gamulin

1
@NikoGamulin, betiğinizin başına tf.compat.v1.enable_eager_execution () eklediğinizden emin olun. Sürüm 1.14.0 var, Scriptimi PyCharm'da çalıştırıyorum ve tensor.numpy () çalışıyor
Tommaso Di Noto

1
@NikoGamulin bu hata sadece Grafik modunda bir tensöre erişmeye çalıştığınızda görünür. Bence, istekli olabilir yürütme düzgün etkinleştirilmedi. İstekli yürütmeyi kontrol etmek için, aa = tf.constant (2.0), b = tf.constant (3.0), yazdır (tf.add (a, b)) tanımlayın. Cevabı 5.0 olarak görüyorsanız istekli düzgün bir şekilde etkinleştirilmiştir.
Vishnuvardhan Janapati

9

Yukarıdaki yanıtlara dayanarak, özel kod snippet'inizle ürünü şu şekilde yazdırabilirsiniz:

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

8

Tensorflow 2.0+ (veya Eager modu ortamında) .numpy()yöntemini çağırabilirsiniz :

import tensorflow as tf

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

print(product.numpy()) 

tf.print(product)aynı zamanda print(product.numpy())TF 2.0 ile aynı çıktıyı veriyor .
HUSMEN

8

tf.keras.backend.eval küçük ifadelerin değerlendirilmesinde yararlıdır.

tf.keras.backend.eval(op)

TF 1.x ve TF 2.0 uyumlu.


Minimum Doğrulanabilir Örnek

from tensorflow.keras.backend import eval

m1 = tf.constant([[3., 3.]])
m2 = tf.constant([[2.],[2.]])

eval(tf.matmul(m1, m2))
# array([[12.]], dtype=float32)

Bu yararlıdır, çünkü açıkça bir Sessionveya oluşturmak zorunda değilsiniz InteractiveSession.


7

İstekli yürütmeyi etkinleştirerek bir oturumda grafiği çalıştırmadan bir TensorObject çıktısını kontrol edebilirsiniz .

Aşağıdaki iki kod satırını eklemeniz yeterlidir: import tensorflow.contrib.eager as tfe tfe.enable_eager_execution()

senden hemen sonra import tensorflow .

Çıktı print product şimdi: tf.Tensor([[ 12.]], shape=(1, 1), dtype=float32)

Şimdilik (Kasım 2017), istekli bir şekilde yürütmek için bir Tensorflow gecelik derlemesi kurmanız gerektiğini unutmayın. Önceden yapılmış tekerlekleri burada bulabilirsiniz .


5

tf.Print()Tensör adını değiştireceğini lütfen unutmayın . Yazdırmak istediğiniz tensör bir yer tutucuysa, besleme sırasında orijinal ad bulunmayacağından, veri besleme başarısız olur. Örneğin:

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

Çıktı:

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

5

TensorFlow Core programlarını iki ayrı bölümden oluşuyor olarak düşünmelisiniz:

  • Hesaplamalı grafik oluşturma.
  • Hesaplamalı grafiği çalıştırma.

Yani aşağıdaki kod için sadece hesaplama grafiğini oluşturun.

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

Ayrıca bir TensorFlow programındaki tüm değişkenleri başlatmak için özel bir işlemi aşağıdaki gibi açıkça çağırmanız gerekir:

init = tf.global_variables_initializer()

Şimdi grafiği oluşturup tüm değişkenleri başlattınız, bir sonraki adım düğümleri değerlendirmektir, bir oturumda hesaplama grafiğini çalıştırmalısınız. Bir oturum, TensorFlow çalışma zamanının denetimini ve durumunu içerir.

Aşağıdaki kod bir Session nesnesi oluşturur ve daha sonra değerlendirmek için hesaplama grafiğinin yeterince çalışmasını sağlamak için run yöntemini çağırır product:

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

print(sess.run([product]))

4

Keras'ı kullanabilirsiniz, tek satırlık cevap şöyle bir evalyöntem kullanmak olacaktır :

import keras.backend as K
print(K.eval(your_tensor))

3

Bu basit kodu deneyin! (kendi kendini açıklar)

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)

2

Bunu yapana kadar tüm cevapları okuduktan sonra bile neyin gerekli olduğunu anlamak kolay olmadı. TensofFlow benim için de yeni.

def printtest():
x = tf.constant([1.0, 3.0])
x = tf.Print(x,[x],message="Test")
init = (tf.global_variables_initializer(), tf.local_variables_initializer())
b = tf.add(x, x)
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(b))
    sess.close()

Ancak yine de oturumu yürüterek döndürülen değere ihtiyacınız olabilir.

def printtest():
    x = tf.constant([100.0])
    x = tf.Print(x,[x],message="Test")
    init = (tf.global_variables_initializer(), tf.local_variables_initializer())
    b = tf.add(x, x)
    with tf.Session() as sess:
        sess.run(init)
        c = sess.run(b)
        print(c)
        sess.close()

1

Temel olarak, tensorflow'da, herhangi bir tür tensör oluşturduğunuzda, içinde yalnızca tensorflow oturumu çalıştırdığınızda erişilebilen bir tür tensör oluşturulur ve saklanır. Eğer sabit bir tensörünü oluşturduk Say
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
bir oturum çalışan olmadan, alabilirsiniz
- op: Bir Operasyonu. Bu tensörü hesaplayan işlem.
- value_index: Bir int. Bu tensörü üreten işlemin uç noktasının dizini.
- dtype: Bir DType. Bu tensörde depolanan elemanların tipi.

Değerleri almak için ihtiyacınız olan tensör ile bir oturum çalıştırabilirsiniz:

with tf.Session() as sess:
    print(sess.run(c))
    sess.close()

Çıktı şu şekilde olacaktır:

dizi ([[1., 2., 3.], [4., 5., 6.]], dtype = float32)


1

1.10 sürümünden sonra tensorflow'da tanıtılan istekli yürütmeyi etkinleştirin. Kullanımı çok kolay.

# Initialize session
import tensorflow as tf
tf.enable_eager_execution()


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

print(a)

1

Https://www.tensorflow.org/api_docs/python/tf/print içinde sağlanan ipuçlarını kullanarak , log_dbiçimlendirilmiş dizeleri yazdırmak için işlevi kullanırım.

import tensorflow as tf

def log_d(fmt, *args):
    op = tf.py_func(func=lambda fmt_, *args_: print(fmt%(*args_,)),
                    inp=[fmt]+[*args], Tout=[])
    return tf.control_dependencies([op])


# actual code starts now...

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

with log_d('MAT1: %s, MAT2: %s', matrix1, matrix2): # this will print the log line
    product = tf.matmul(matrix1, matrix2)

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

0
import tensorflow as tf
sess = tf.InteractiveSession()
x = [[1.,2.,1.],[1.,1.,1.]]    
y = tf.nn.softmax(x)           

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

print(product.eval())
tf.reset_default_graph()
sess.close()

0

tf.Print artık kullanımdan kaldırılmıştır, bunun yerine tf.print (küçük harf p) nasıl kullanılacağı aşağıda açıklanmıştır.

Bir seans yürütmek iyi bir seçenektir, ancak bu her zaman bir yol değildir. Örneğin, belirli bir oturumda bir tensör yazdırmak isteyebilirsiniz.

Yeni yazdırma yöntemi, çıkış tensörü olmayan bir yazdırma işlemi döndürür:

print_op = tf.print(tensor_to_print)

Çıktısı olmadığından, tf.Print ile aynı şekilde bir grafiğe ekleyemezsiniz. Bunun yerine, yazdırmak için oturumunuzdaki bağımlılıkları kontrol etmek için ekleyebilirsiniz.

sess = tf.compat.v1.Session()
with sess.as_default():
  tensor_to_print = tf.range(10)
  print_op = tf.print(tensor_to_print)
with tf.control_dependencies([print_op]):
  tripled_tensor = tensor_to_print * 3
sess.run(tripled_tensor)

Bazen, daha büyük bir grafikte, kısmen alt işlevlerde yaratılabilir, print_op'u oturum çağrısına yaymak zahmetlidir. Daha sonra, tf.tuple, yazdırma işlemini başka bir işlemle eşleştirmek için kullanılabilir; bu işlem daha sonra hangi oturum kodu çalıştırırsa o işlemle çalışacaktır. İşte böyle yapılır:

print_op = tf.print(tensor_to_print)
some_tensor_list = tf.tuple([some_tensor], control_inputs=[print_op])
# Use some_tensor_list[0] instead of any_tensor below.

-2

Soru: TensorFlow'da bir Tensor nesnesinin değeri nasıl yazdırılır?

Cevap:

import tensorflow as tf

# Variable
x = tf.Variable([[1,2,3]])

# initialize
init = (tf.global_variables_initializer(), tf.local_variables_initializer())

# Create a session
sess = tf.Session()

# run the session
sess.run(init)

# print the value
sess.run(x)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.