Soy consciente de que en TensorFlow, un tensor tf.string es básicamente una cadena de bytes. Necesito hacer alguna operación con un nombre de archivo que se almacena en una cola usando tf.train.string_input_producer() .
A continuación se muestra un pequeño fragmento:
key, value = reader.read(filename_queue) filename = value.eval(session=sess) print(filename)Sin embargo, como una cadena de bytes, da una salida como la siguiente:
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\x07\x07\t\t\x08'Traté de convertir usando
filename = tf.decode_raw(filename, tf.uint8) filename = ''.join(chr(i) for i in filename)Sin embargo, los objetos Tensor no son iterables y, por lo tanto, esto falla.
¿Dónde me estoy equivocando?
¿Es una característica que falta en TensorFlow que tf.string se convierta fácilmente en una cadena de Python, o hay alguna otra característica que desconozco?
Más información
El filename_queue se ha preparado de la siguiente manera:
train_set = ['file1.jpg', 'file2.jpg'] # Truncated for illustration filename_queue = tf.train.string_input_producer(train_set, num_epochs=10, seed=0, capacity=1000)En tensorflow 2.0.0, se puede hacer de la siguiente manera:
import tensorflow as tf my_str = tf.constant('Hello World') my_str_npy = my_str.numpy() print(my_str_npy) type(my_str_npy)Esto convierte un tensor de cadena en una cadena de clase 'bytes'
key, value = reader.read(filename_queue)En esto, el lector solo lee el archivo que le proporciona, por lo que el valor es el contenido del archivo, no el nombre del archivo, pero puede generar la clave, luego obtiene el nombre del archivo
En el conjunto de datos, puede hacer esto mediante el envoltorio tf.numpy_function
def get_img(path): path = bytes.decode(path) # called when use dataset since dataset is generator img = skimage.io.MultiImage(path)[-1] print(img.shape, type(img)) return path def wrap_get_img(path): # turn tf.Tensor to tf.EagerTensor through the wrapper return tf.numpy_function(get_img, [path], [tf.string]) # [<tf.Tensor 'EagerPyFunc:0' dataset = tf.data.Dataset.list_files("../prostate-cancer-grade-assessment/train_images/*.tiff") \ .repeat() \ .shuffle(buffer_size=len(files)) \ .map(wrap_get_img ) for x in dataset: print(x) # Eager Tensor which can get string break