Como converter um tensor em tensor Eager no Tensorflow 2.1.0?
Tenho tentado converter um tensor do tipo:
tensorflow.python.framework.ops.Tensor
para um eagertensor:
<class 'tensorflow.python.framework.ops.EagerTensor'>
Procurei uma solução, mas não consegui encontrar. Qualquer ajuda seria apreciada.
Contexto:
Obtive o tensor usando o método de extração de características de um modelo sequencial de Keras. A saída foi um tensor do primeiro tipo mencionado. No entanto, quando tentei convertê-lo para numpy usando .numpy (), não funcionou com o seguinte erro:
'Tensor' object has no attribute 'numpy'
Mas então, quando tento criar um tensor usando tf.constant e depois usando .numpy () para convertê-lo, funciona bem!
A única diferença que encontrei é que os tipos de tensores são diferentes: o tensor gerado pelo sequencial de Keras é do primeiro tipo mencionado acima, enquanto o segundo tensor que criei manualmente é do segundo tipo (tensor Eager).
Respostas
Escrever mais uma resposta porque o mesmo erro aparece em um cenário diferente.
O erro que você está obtendo é devido ao problema de versão tensorflow version 2.1.0. Eu corri o código, ignorando os 2 primeiros parágrafos que é para instalar tensorflow==2.1.0e keras==2.3.1eo erro não reapareceu.
Seu problema desaparece na versão mais recente do tensorflow version 2.3.0. Execute o programa nas versões mais recentes, o que significa que não instale tensorflow e keras novamente porque o Google Colab já tem a versão mais recente e estável pré-instalada.
features.numpy()
Resultado -
array([[0. , 0.3728346, 0. , ..., 1.0103987, 0. ,
0.4194043]], dtype=float32)
Poderia ter respondido melhor se você tivesse compartilhado o código reproduzível.
Abaixo está um cenário simples em que recriei seu erro. Aqui estou lendo o caminho de um arquivo de imagem.
Código para recriar o erro:
%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)
Resultado:
---------------------------------------------------------------------------
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'
Abaixo estão as etapas que implementei no código para corrigir esse erro.
- Decorou a função de mapa com
tf.py_function(get_path, [x], [tf.string]). Você pode encontrar mais sobre tf.py_function aqui . - Agora posso obter a parte da string usando a
bytes.decode(file_path.numpy())função de mapa.
Código Fixo:
%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)
Resultado:
file_path: /content/bird.jpg <class 'str'>
(<tf.Tensor: shape=(), dtype=string, numpy=b'/content/bird.jpg'>,)
espero que isso responda sua pergunta.