Tensorflow 2.1.0でTensorをEagerテンソルに変換する方法は?

Oct 17 2020

私はタイプのテンソルを変換しようとしています:

tensorflow.python.framework.ops.Tensor

eagertensorへ:

<class 'tensorflow.python.framework.ops.EagerTensor'>

私は解決策を探していましたが、見つかりませんでした。どんな助けでもいただければ幸いです。

環境:

KerasSequentialモデルから特徴抽出法を使用してテンソルを取得しました。出力は、最初に述べたタイプのテンソルでした。ただし、.numpy()を使用してnumpyに変換しようとすると、次のエラーで機能しませんでした。

'Tensor' object has no attribute 'numpy'

しかし、tf.constantを使用してテンソルを作成し、次に.numpy()を使用して変換しようとすると、正常に機能します。

私が見つけた唯一の違いは、テンソルのタイプが異なることです。Kerasシーケンシャルによって生成されたテンソルは、上記の最初のタイプですが、手動で作成した2番目のテンソルは2番目のタイプ(Eagerテンソル)です。

回答

1 TFer Oct 22 2020 at 01:01

同じエラーが別のシナリオで表示されるので、もう1つ答えを書きます。

発生するエラーは、バージョンの問題が原因ですtensorflow version 2.1.0。私がインストールしてある最初の2つの段落スキップしてコードを実行したtensorflow==2.1.0とするkeras==2.3.1と、エラーが再表示されませんでした。

あなたの問題は、の最新バージョンで消えますtensorflow version 2.3.0。最新バージョンでプログラムを実行します。つまり、Google Colabには最新の安定バージョンがプリインストールされているため、tensorflowとkerasを再度インストールしないでください。

features.numpy()

出力-

array([[0.       , 0.3728346, 0.       , ..., 1.0103987, 0.       ,
        0.4194043]], dtype=float32)
1 TFer Oct 20 2020 at 16:32

再現可能なコードを共有していれば、もっとうまく答えることができたでしょう。

以下は、エラーを再現した簡単なシナリオです。ここで私は画像ファイルのパスを読んでいます。

エラーを再現するコード:

%tensorflow_version 2.x
import tensorflow as tf
import numpy as np

def get_path(file_path):
    print("file_path: ", bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))
    return file_path

train_dataset = tf.data.Dataset.list_files('/content/bird.png')
train_dataset = train_dataset.map(lambda x: (get_path(x)))

for one_element in train_dataset:
    print(one_element)

出力:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-2d5db8425f67> in <module>()
      8 
      9 train_dataset = tf.data.Dataset.list_files('/content/bird.png')
---> 10 train_dataset = train_dataset.map(lambda x: (get_path(x)))
     11 
     12 for one_element in train_dataset:

10 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/impl/api.py in wrapper(*args, **kwargs)
    256       except Exception as e:  # pylint:disable=broad-except
    257         if hasattr(e, 'ag_error_metadata'):
--> 258           raise e.ag_error_metadata.to_exception(e)
    259         else:
    260           raise

AttributeError: in user code:

    <ipython-input-8-2d5db8425f67>:10 None  *
        train_dataset = train_dataset.map(lambda x: (get_path(x)))
    <ipython-input-8-2d5db8425f67>:6 get_path  *
        print("file_path: ", bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))

    AttributeError: 'Tensor' object has no attribute 'numpy'

以下は、このエラーを修正するためにコードに実装した手順です。

  1. マップ関数をで装飾しましたtf.py_function(get_path, [x], [tf.string])。tf.py_functionの詳細については、こちらをご覧ください。
  2. これbytes.decode(file_path.numpy())で、inmap関数を使用して文字列部分を取得できます。

修正されたコード:

%tensorflow_version 2.x
import tensorflow as tf
import numpy as np

def get_path(file_path):
    print("file_path: ",bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))
    return file_path

train_dataset = tf.data.Dataset.list_files('/content/bird.jpg')
train_dataset = train_dataset.map(lambda x: tf.py_function(get_path, [x], [tf.string]))

for one_element in train_dataset:
    print(one_element)

出力:

file_path:  /content/bird.jpg <class 'str'>
(<tf.Tensor: shape=(), dtype=string, numpy=b'/content/bird.jpg'>,)

これがあなたの質問に答えることを願っています。