Bagaimana saya bisa mengubah tensor menjadi array numpy di TensorFlow?

181

Bagaimana cara mengubah tensor menjadi array numpy saat menggunakan Tensorflow dengan Python bindings?

mathetes
sumber

Jawaban:

134

Tensor apa pun yang dikembalikan oleh Session.runatau evalmerupakan array NumPy.

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

Atau:

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

Atau, yang setara:

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

EDIT: Tidak ada tensor yang dikembalikan oleh Session.runatau eval()merupakan array NumPy. Tensor Jarang misalnya dikembalikan sebagai SparseTensorValue:

>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>
Lenar Hoyt
sumber
AttributeError: module 'tensorflow' tidak memiliki atribut 'Session'
Jürgen K.
77

Untuk mengkonversi kembali dari tensor ke array numpy, Anda cukup menjalankan .eval()pada tensor yang diubah.

Rafał Józefowicz
sumber
5
untuk memperjelas: yourtensor.eval ()
mrk
12
Saya mendapatkan 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)'Apakah ini hanya dapat digunakan selama sesi aliran uang?
Eduardo Pignatelli
@EduardoPignatelli Ini bekerja untuk saya di Theano tanpa kerja ekstra. Tidak yakin tentang tf.
BallpointBen
5
@EduardoPignatelli Anda perlu menjalankan .eval()pemanggilan metode dari dalam sesi: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime
Dengan menggunakan ini saya mendapatkan kesalahan sebagai AttributeError: objek 'Tensor' tidak memiliki atribut 'eval'
Aakash aggarwal
72

TensorFlow 2.x

Eksekusi Eager diaktifkan secara default, jadi panggil saja .numpy()objek Tensor.

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)

Perlu dicatat (dari dokumen),

Array numpy dapat berbagi memori dengan objek Tensor. Setiap perubahan satu dapat tercermin dalam yang lain.

Penekanan berani saya. Salinan dapat dikembalikan atau tidak, dan ini merupakan detail implementasi.


Jika Eksekusi Eager dinonaktifkan, Anda dapat membuat grafik dan kemudian menjalankannya melalui 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)

Lihat juga Peta Simbol TF 2.0 untuk pemetaan API lama ke yang baru.

cs95
sumber
2
Bagaimana melakukan ini di dalam suatu fungsi?
mathtick
@mentalmushroom Tidak dapat menemukan dokumentasi tetapi disebutkan di manual penyesuaian . Rincian lebih lanjut dapat ditemukan di sumber .
nish-ant
5
Saya mendapatkan kesalahan berikut dalam TF 2.0: "objek 'Tensor' tidak memiliki atribut 'numpy'"
Will.Evo
@ Will.Evo mungkin saja Anda menonaktifkan eksekusi yang bersemangat sebelum menjalankan ini. Periksa bagian kedua dari jawaban saya di mana Anda dapat menggunakan eval().
cs95
2
Tidak, saya tidak menonaktifkan eksekusi cepat. Masih mendapatkan AttributeError: objek 'Tensor' tidak memiliki atribut 'numpy'
Geoffrey Anderson
6

Kamu butuh:

  1. mengkodekan tensor gambar dalam beberapa format (jpeg, png) ke tensor biner
  2. mengevaluasi (menjalankan) tensor biner dalam suatu sesi
  3. putar biner untuk streaming
  4. umpan ke gambar PIL
  5. (opsional) tampilkan gambar dengan matplotlib

Kode:

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)

Ini berhasil untuk saya. Anda bisa mencobanya di notebook ipython. Jangan lupa untuk menambahkan baris berikut:

%matplotlib inline
Gooshan
sumber
4

Mungkin Anda bisa mencoba, metode ini:

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)
lovychen
sumber
2

Saya telah menghadapi dan menyelesaikan konversi tensor-> ndarray dalam kasus khusus tensor yang mewakili gambar (permusuhan), diperoleh dengan pustaka pintar / tutorial.

Saya pikir pertanyaan / jawaban saya (di sini ) dapat menjadi contoh yang bermanfaat juga untuk kasus lain.

Saya baru dengan TensorFlow, milik saya adalah kesimpulan empiris:

Tampaknya metode tensor.eval () mungkin perlu, agar berhasil, juga nilai bagi tempat penampung input . Tensor dapat bekerja seperti fungsi yang membutuhkan nilai inputnya (disediakan ke feed_dict) untuk mengembalikan nilai output, misalnya

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

Harap perhatikan bahwa nama placeholder adalah x dalam kasus saya, tetapi saya kira Anda harus mencari tahu nama yang tepat untuk placeholder input . x_inputadalah nilai skalar atau array yang berisi data input.

Dalam kasus saya juga menyediakan sessadalah wajib.

Contoh saya juga mencakup bagian visualisasi gambar matplotlib , tapi ini OT.

Fabiano Tarlao
sumber
1

Contoh sederhana bisa jadi,

    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 sekarang jika kita ingin tensor ini dikonversi menjadi array numpy

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

Sesimpel itu!

Saurabh Kumar
sumber
//bukan untuk berkomentar dengan python. Harap edit jawaban Anda.
Vlad
0

Anda dapat menggunakan fungsi backend keras.

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

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

print(type(array))

<class 'numpy.ndarray'>

Saya harap ini membantu!

Ebin Zacharias
sumber