1. ホーム
  2. python

[解決済み] Tensorflowでテンソルをnumpyの配列に変換する?

2022-03-09 23:53:34

質問

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

どのように解決するのですか?

TensorFlow 2.x

熱心な実行 はデフォルトで有効になっているので .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との互換性 をご覧ください。注目すべきは(docsから)です。

Numpyの配列はTensorオブジェクトとメモリを共有することがあります。 一方への変更は他方に反映される可能性があります。

太字強調は私です。コピーが返されるかどうかは、データがCPUにあるかGPUにあるかに基づく実装の詳細です(後者の場合、GPUからホストメモリにコピーを作成する必要があります)。

しかし、なぜ私は AttributeError: 'Tensor' object has no attribute 'numpy' ? .
この問題については、多くの人がコメントしています。いくつかの理由が考えられます。

  • TF 2.0が正しくインストールされていない(その場合は再インストールをお試しください)、または
  • TF2.0はインストールされているが、何らかの理由でEagerの実行が無効になっている。そのような場合は tf.compat.v1.enable_eager_execution() を有効化するか、以下を参照してください。

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)

参照 TF2.0シンボルマップ は、旧APIと新APIのマッピングを参照してください。