Bir tensörü TensorFlow'da bir numpy dizisine nasıl dönüştürebilirim?


181

Python bağlamaları ile Tensorflow kullanırken bir tensörü numpy diziye nasıl dönüştürebilirim?

Yanıtlar:


134

Session.runVeya tarafından döndürülen herhangi bir tensör evalbir NumPy dizisidir.

>>> print(type(tf.Session().run(tf.constant([1,2,3]))))
<class 'numpy.ndarray'>

Veya:

>>> sess = tf.InteractiveSession()
>>> print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>

Veya eşdeğer olarak:

>>> sess = tf.Session()
>>> with sess.as_default():
>>>    print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>

DÜZENLEME: Değil herhangi tensör tarafından döndürülen Session.runveya eval()bir NumPy dizidir. Örneğin Seyrek Tensörler SparseTensorDeğer olarak döndürülür:

>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>

AttributeError: 'tensorflow' modülünün 'Session' özelliği yok
Jürgen K.

77

Tensörden numpy dizisine geri dönüştürmek için dönüştürülmüş tensör .eval()üzerinde çalışabilirsiniz .


5
açıklığa kavuşturmak için: yourtensor.eval ()
mrk

12
Ben olsun ValueError: Cannot evaluate tensor using 'eval()': No default session is registered. Use 'with sess.as_default()' or pass an explicit session to 'eval(session=sess)'bu sadece bir tensoflow oturumu sırasında kullanılabilir mi?
Eduardo Pignatelli

@EduardoPignatelli Benim için Theano'da fazladan bir iş yapmadan çalışıyor. Tf hakkında emin değilim.
BallpointBen

5
@EduardoPignatelli .eval()bir oturum içinden yöntem çağrısını çalıştırmanız gerekiyor :sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime

Bunu kullanarak AttributeError olarak hata alıyorum: 'Tensor' nesnesi 'eval' özniteliği yok
Aakash aggarwal

73

TensorFlow 2.x

Eager Execution varsayılan olarak etkindir, bu nedenle .numpy()Tensor nesnesini çağırmanız yeterlidir.

import tensorflow as tf

a = tf.constant([[1, 2], [3, 4]])                 
b = tf.add(a, 1)

a.numpy()
# array([[1, 2],
#        [3, 4]], dtype=int32)

b.numpy()
# array([[2, 3],
#        [4, 5]], dtype=int32)

tf.multiply(a, b).numpy()
# array([[ 2,  6],
#        [12, 20]], dtype=int32)

Dikkat çekmeye değer (dokümanlardan),

Numpy dizisi belleği Tensor nesnesiyle paylaşabilir. Birindeki değişiklikler diğerine yansıtılabilir.

Cesur vurgu benim. Bir kopya iade edilebilir veya edilmeyebilir ve bu bir uygulama detayıdır.


Eager Yürütme devre dışı bırakılmışsa, bir grafik oluşturabilir ve ardından şu şekilde çalıştırabilirsiniz tf.compat.v1.Session:

a = tf.constant([[1, 2], [3, 4]])                 
b = tf.add(a, 1)
out = tf.multiply(a, b)

out.eval(session=tf.compat.v1.Session())    
# array([[ 2,  6],
#        [12, 20]], dtype=int32)

Eski API'nin yenisiyle eşlenmesi için TF 2.0 Semboller Haritasına da bakın .


2
Nasıl bir tf.function İÇİNDE?
mathtick

@mentalmushroom Bir doküman bulunamadı, ancak kişiselleştirme kılavuzunda belirtilmiştir . Daha fazla ayrıntı kaynakta bulunabilir .
nish-ant

5
TF 2.0 aşağıdaki hatayı alıyorum: "'Tensor' nesnesi 'numpy' özniteliği yok
Will.Evo

@ Will.Evo bunu çalıştırmadan önce istekli yürütmeyi devre dışı bırakmanız mümkündür. Cevabımın ikinci yarısını nerede kullanabileceğinizi kontrol edin eval().
cs95

2
Hayır İstekli icrayı devre dışı bırakmadım. Hala AttributeError: 'Tensor' nesnesinin 'numpy' özelliği yok
Geoffrey Anderson

6

Gerek:

  1. görüntü tensörünü bir biçimde (jpeg, png) ikili tensöre kodlamak
  2. bir oturumdaki ikili tensörü değerlendirir (çalıştırır)
  3. akış için ikiliyi çevirin
  4. PIL resmine besleme
  5. (isteğe bağlı) görüntüyü matplotlib ile görüntüleme

Kod:

import tensorflow as tf
import matplotlib.pyplot as plt
import PIL

...

image_tensor = <your decoded image tensor>
jpeg_bin_tensor = tf.image.encode_jpeg(image_tensor)

with tf.Session() as sess:
    # display encoded back to image data
    jpeg_bin = sess.run(jpeg_bin_tensor)
    jpeg_str = StringIO.StringIO(jpeg_bin)
    jpeg_image = PIL.Image.open(jpeg_str)
    plt.imshow(jpeg_image)

Bu benim için çalıştı. Bir ipython not defterinde deneyebilirsiniz. Aşağıdaki satırı eklemeyi unutmayın:

%matplotlib inline

4

Belki bu yöntemi deneyebilirsiniz:

import tensorflow as tf
W1 = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
array = W1.eval(sess)
print (array)

2

Cleverhans kütüphanesi / öğreticileri ile elde edilen (çekişmeli) görüntüleri temsil eden özel tensörler durumunda tensör-> ndarray dönüşümüyle karşılaştım ve çözdüm .

Soru / cevabımın ( burada ) diğer durumlar için de yararlı bir örnek olabileceğini düşünüyorum.

TensorFlow'da yeniyim, benimki ampirik bir sonuç:

Başarılı olmak için tensor.eval () yönteminin girdi yer tutucuları için de değere ihtiyacı olabilir . Tensör, feed_dictbir çıkış değeri döndürmek için giriş değerlerine (içine verilen ) ihtiyaç duyan bir işlev gibi çalışabilir , örn.

array_out = tensor.eval(session=sess, feed_dict={x: x_input})

Benim durumumda yer tutucu adının x olduğunu lütfen unutmayın , ancak giriş yer tutucusu için doğru adı bulmanız gerektiğini düşünüyorum . x_inputbir skaler değer veya girdi verilerini içeren bir dizidir.

Benim durumumda da sağlanması sesszorunluydu.

Örneğim matplotlib görüntü görselleştirme bölümünü de kapsıyor , ancak bu OT.


1

Basit bir örnek,

    import tensorflow as tf
    import numpy as np
    a=tf.random_normal([2,3],0.0,1.0,dtype=tf.float32)  #sampling from a std normal
    print(type(a))
    #<class 'tensorflow.python.framework.ops.Tensor'>
    tf.InteractiveSession()  # run an interactive session in Tf.

n şimdi bu tensörün a'nın numpy dizisine dönüştürülmesini istiyorsak

    a_np=a.eval()
    print(type(a_np))
    #<class 'numpy.ndarray'>

Kadar basit!


//python'da yorum yapmak için değildir. Lütfen cevabınızı düzenleyin.
Vlad


0

Keras arka uç işlevini kullanabilirsiniz.

import tensorflow as tf
from tensorflow.python.keras import backend 

sess = backend.get_session()
array = sess.run(< Tensor >)

print(type(array))

<class 'numpy.ndarray'>

Umut ediyorum bu yardım eder!

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.