Een tensor converteren naar een numpy-array in Tensorflow?

Hoe zet je een tensor om in een numpy-array bij gebruik van Tensorflow met Python-bindingen?


Antwoord 1, autoriteit 100%

TensorFlow 2.x

Eager Executionis standaard ingeschakeld, dus bel gewoon .numpy()op het Tensor-object.

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)

Zie NumPy-compatibiliteitvoor meer informatie. Het is vermeldenswaard (uit de documenten),

Numpy-array kan geheugen delen met het Tensor-object. Alle wijzigingen aan de ene kunnen worden weerspiegeld in de andere.

Vette nadruk van mij. Een kopie kan al dan niet worden geretourneerd, en dit is een implementatiedetail op basis van of de gegevens zich in de CPU of GPU bevinden (in het laatste geval moet er een kopie worden gemaakt van GPU naar hostgeheugen).

Maar waarom krijg ik AttributeError: 'Tensor' object has no attribute 'numpy'?.
Veel mensen hebben opmerkingen gemaakt over dit probleem, er zijn een aantal mogelijke redenen:

  • TF 2.0 is niet correct geïnstalleerd (probeer in dat geval opnieuw te installeren), of
  • TF 2.0 is geïnstalleerd, maar de gretige uitvoering is om de een of andere reden uitgeschakeld. Bel in dergelijke gevallen tf.compat.v1.enable_eager_execution()om het in te schakelen, of zie hieronder.

Als Eager Execution is uitgeschakeld, kun je een grafiek maken en deze vervolgens uitvoeren via 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)

Zie ook TF 2.0-symbolenkaartvoor een toewijzing van de oude API naar de nieuwe.


Antwoord 2, autoriteit 99%

Elke tensor die wordt geretourneerd door Session.runof evalis een NumPy-array.

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

Of:

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

Of, equivalent:

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

EDIT:Geen elketensor geretourneerd door Session.runof eval()is een NumPy-array. Sparse Tensors worden bijvoorbeeld geretourneerd als SparseTensorValue:

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

Antwoord 3, autoriteit 58%

Om terug te converteren van tensor naar numpy-array, kun je eenvoudig .eval()uitvoeren op de getransformeerde tensor.


Antwoord 4, autoriteit 5%

Je moet:

  1. codeer de afbeeldingstensor in een bepaald formaat (jpeg, png) naar binaire tensor
  2. evalueer (voer uit) de binaire tensor in een sessie
  3. draai het binaire bestand om te streamen
  4. feed naar PIL-afbeelding
  5. (optioneel) toon de afbeelding met matplotlib

Code:

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)

Dit werkte voor mij. Je kunt het proberen in een ipython-notebook. Vergeet niet de volgende regel toe te voegen:

%matplotlib inline

Antwoord 5, autoriteit 4%

Misschien kun je deze methode proberen:

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)

Antwoord 6, autoriteit 2%

Ik heb de tensor->ndarray-conversie onder ogen gezien en opgelost in het specifieke geval van tensoren die (tegengestelde) afbeeldingen vertegenwoordigen, verkregen met cleverhansbibliotheek/tutorials.

p>

Ik denk dat mijn vraag/antwoord (hier) kan ook een nuttig voorbeeld zijn voor andere gevallen.

Ik ben nieuw bij TensorFlow, de mijne is een empirische conclusie:

Het lijkt erop dat de methode tensor.eval() mogelijk ook de waarde voor invoer plaatsaanduidingennodig heeft om te slagen.
Tensor kan werken als een functie die zijn invoerwaarden nodig heeft (geleverd in feed_dict) om een ​​uitvoerwaarde te retourneren, bijvoorbeeld

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

Houd er rekening mee dat de naam van de tijdelijke aanduiding in mijn geval xis, maar ik veronderstel dat u de juiste naam moet vinden voor de invoer plaatsaanduiding.
x_inputis een scalaire waarde of array die invoergegevens bevat.

In mijn geval was ook het verstrekken van sessverplicht.

Mijn voorbeeld dekt ook het matplotlibbeeldvisualisatiegedeelte, maar dit is OT.


Antwoord 7

Een eenvoudig voorbeeld zou kunnen zijn,

   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
als we nu willen dat deze tensor a wordt omgezet in een numpy-array

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

Zo simpel is het!


Antwoord 8

Ik was dagen aan het zoeken naar deze opdracht.

Dit werkte voor mij buiten elke sessie of iets dergelijks.

# you get an array = your tensor.eval(session=tf.compat.v1.Session())
an_array = a_tensor.eval(session=tf.compat.v1.Session())

https://kite.com/python/answers/how-to-convert-a-tensorflow-tensor-to-a-numpy-array-in-python


Antwoord 9

Als je ziet dat er een methode is _numpy(),
bijv. voor een EagerTensor roept u gewoon de bovenstaande methode aan en u krijgt een ndarray.


Antwoord 10

U kunt de backend-functie van Keras gebruiken.

import tensorflow as tf
from tensorflow.python.keras import backend 
sess = backend.get_session()
array = sess.run(< Tensor >)
print(type(array))
<class 'numpy.ndarray'>

Ik hoop dat het helpt!


Antwoord 11

Je kunt een tensor in tensorflowop de volgende manieren converteren naar een numpy-array.

Eerst:
Gebruik np.array(your_tensor)

Tweede:
Gebruik your_tensor.numpy

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes