TensorFlowでテンソルを派手な配列に変換するにはどうすればよいですか?


181

TensorflowをPythonバインディングで使用するときにテンソルをnumpy配列に変換する方法は?

回答:


134

NumPy配列によって返される、Session.runまたはevalNumPy配列であるテンソル。

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

または:

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

または、同等に:

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

EDIT:ない任意のテンソルで返されるSession.runか、eval()numpyの配列です。たとえば、スパーステンソルはSparseTensorValueとして返されます。

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

AttributeError:モジュールのtensorflow 'には属性「セッション」がありません
ユルゲン・K.

77

テンソル配列をnumpy配列に戻す.eval()には、変換されたテンソルで実行するだけです。


5
明確にするために:yourtensor.eval()
mrk 2017年

12
私は取得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)'のみtensoflowセッション中にこの使用可能ですか?
Eduardo Pignatelli

@EduardoPignatelliそれはテアノで私のために働くので、余計な作業は必要ありません。tfについては不明です。
BallpointBen 2018年

5
@EduardoPignatelliあなたが実行する必要があります.eval():セッション内からのメソッド呼び出し sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime

これを使用すると、AttributeErrorとしてエラーが発生します。「Tensor」オブジェクトには属性「eval」がありません
Aakash aggarwal

72

TensorFlow 2.x

Eager Executionはデフォルトで有効になっているため.numpy()、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)

(ドキュメントから)注目に値します、

Numpy配列はTensorオブジェクトとメモリを共有する場合があります。一方に対する変更は、他方に反映される場合があります。

大胆な強調鉱山。コピーが返される場合と返されない場合があり、これは実装の詳細です。


Eager Executionが無効になっている場合は、グラフを作成してから実行できます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)

古いAPIから新しいAPIへのマッピングについては、TF 2.0シンボルマップも参照してください。


2
tf.function内でこれを行う方法?
mathtick

@mentalmushroomドキュメントが見つかりませんでしたが、カスタマイズマニュアルに記載されてい ます。詳細はソースにあります。
nish-ant

5
TF 2.0で次のエラーが発生します:「 'Tensor'オブジェクトには属性 'numpy'がありません」
Will.Evo

@ Will.Evoこれを実行する前に熱心な実行を無効にした可能性があります。あなたが使用できる私の答えの後半を確認してくださいeval()
cs95

2
いいえ熱心な実行を無効にしませんでした。それでもAttributeErrorを取得する: 'Tensor'オブジェクトに属性 'numpy'がない
Geoffrey Anderson

6

必要がある:

  1. 画像テンソルを何らかの形式(jpeg、png)でバイナリテンソルにエンコードする
  2. セッションでバイナリテンソルを評価(実行)する
  3. バイナリをストリームに変換します
  4. PIL画像にフィード
  5. (オプション)matplotlibで画像を表示する

コード:

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)

これでうまくいきました。あなたはipythonノートブックでそれを試すことができます。次の行を追加することを忘れないでください。

%matplotlib inline

4

多分あなたは試すことができます、この方法:

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ライブラリ/チュートリアルで取得された(敵対的な)画像を表すテンソルの特定のケースにおけるテンソル-> ndarray変換に直面して解決しました

私の質問/回答(ここ)は、他の場合にも役立つ例だと思います。

私はTensorFlowを使い始めたばかりですが、これは経験的な結論です。

tensor.eval()メソッドは、成功するために、入力プレースホルダーの値も必要とする場合があります。Tensorはfeed_dict、出力値を返すために入力値(に提供される)を必要とする関数のように機能する場合があります。

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

私の場合、プレースホルダー名はxですが、入力プレースホルダーの正しい名前を見つける必要があると思います。 x_input入力データを含むスカラー値または配列です。

私の場合、提供sessも必須でした。

私の例では、matplotlib画像の視覚化の部分も取り上げていますが、これはOTです。


1

簡単な例は、

    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このテンソルaをnumpy配列に変換する場合

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

とても簡単!


//Pythonでコメントするためのものではありません。回答を編集してください。
Vlad


0

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

お役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.