¿Cómo convertir un tensor a tensor ansioso en Tensorflow 2.1.0?

Oct 17 2020

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

1 TFer Oct 22 2020 at 01:01

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)
1 TFer Oct 20 2020 at 16:32

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.

  1. 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í .
  2. 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.