I am aware that in TensorFlow, a tf.string tensor is basically a byte string. I need to do some operation with a filename which is stored in a queue using tf.train.string_input_producer().
A small snippet is shown below :
key, value = reader.read(filename_queue)
filename = value.eval(session=sess)
print(filename)
However as a byte string it gives an output like the following :
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'
I tried to convert using
filename = tf.decode_raw(filename, tf.uint8)
filename = ''.join(chr(i) for i in filename)
However Tensor objects are not iterable and hence this fails.
Where am I going wrong ?
Is it a missing feature in TensorFlow that tf.string be converted to a Python string easily , or is there some other feature I am not aware about ?
More Info
The filename_queue has been prepared as follows :
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)
In tensorflow 2.0.0, it can be done in the following way:
import tensorflow as tf
my_str = tf.constant('Hello World')
my_str_npy = my_str.numpy()
print(my_str_npy)
type(my_str_npy)
This converts a string tensor into a string of 'bytes' class
key, value = reader.read(filename_queue)
In this, the Reader just read the file you give, so value is the content of the file, not the filename, but you can output key, then you get filename
In dataset, you can do this by tf.numpy_function wrapper
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