¿Cómo convertir un tensor a tensor ansioso en Tensorflow 2.1.0?
He estado intentando convertir un tensor de tipo:
tensorflow.python.framework.ops.Tensor
a un sensor de alerta:
<class 'tensorflow.python.framework.ops.EagerTensor'>
He estado buscando una solución, pero no pude encontrarla. Cualquier ayuda sería apreciada.
Contexto:
Obtuve el tensor utilizando el método de extracción de características de un modelo secuencial de Keras. La salida fue un tensor del primer tipo mencionado. Sin embargo, cuando intenté convertirlo a numpy usando .numpy (), no funcionó con el siguiente error:
'Tensor' object has no attribute 'numpy'
Pero luego, cuando intento crear un tensor usando tf.constant y luego usando .numpy () para convertirlo, ¡funciona bien!
La única diferencia que encontré es que los tipos de tensores son diferentes: el tensor generado por Keras secuencial es del primer tipo mencionado anteriormente, mientras que el segundo tensor que he creado manualmente es del segundo tipo (tensor Eager).
Respuestas
Escribir una respuesta más porque aparece el mismo error en un escenario diferente.
El error que recibe se debe a un problema de versión .ie tensorflow version 2.1.0. Me encontré con el código saltándose los 2 primeros párrafos que se va a instalar tensorflow==2.1.0y keras==2.3.1y el error no volvió a aparecer.
Su problema desaparece en la última versión de tensorflow version 2.3.0. Ejecute el programa en las últimas versiones, eso significa que no instale tensorflow y keras nuevamente porque Google Colab ya tiene la última versión estable preinstalada.
features.numpy()
Salida -
array([[0. , 0.3728346, 0. , ..., 1.0103987, 0. ,
0.4194043]], dtype=float32)
Podría haber respondido mejor si hubiera compartido el código reproducible.
A continuación se muestra un escenario simple en el que he recreado su error. Aquí estoy leyendo la ruta de un archivo de imagen.
Código para recrear el error:
%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)
Salida:
---------------------------------------------------------------------------
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'
A continuación se muestran los pasos que he implementado en el código para corregir este error.
- Han decorado la función de mapa con
tf.py_function(get_path, [x], [tf.string]). Puede encontrar más información sobre tf.py_function aquí . - Ahora puedo obtener la parte de la cadena usando la
bytes.decode(file_path.numpy())función de mapa.
Código fijo:
%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)
Salida:
file_path: /content/bird.jpg <class 'str'>
(<tf.Tensor: shape=(), dtype=string, numpy=b'/content/bird.jpg'>,)
Espero que esto responda a su pregunta.