我知道在TensorFlow中,tf.string张量基本上是一个字节串。我需要使用tf.train.string_input_producer()存储在队列中的文件名进行一些操作。
下面显示了一个小片段:
key, value = reader.read(filename_queue)
filename = value.eval(session=sess)
print(filename)
但是,作为字节字符串,它提供如下输出:
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'
我尝试使用
转换filename = tf.decode_raw(filename, tf.uint8)
filename = ''.join(chr(i) for i in filename)
然而,Tensor对象不可迭代,因此失败。
我哪里错了?
TensorFlow中缺少的特性是tf.string是否可以轻松转换为Python字符串,还是有其他一些我不知道的功能?
更多信息
filename_queue的编写如下:
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)
答案 0 :(得分:1)
key, value = reader.read(filename_queue)
在这里,Reader只读取你给出的文件,所以value是文件的内容,而不是文件名,但你可以输出密钥,然后你得到文件名
答案 1 :(得分:0)
如果我正确理解了您的问题,可以尝试:
print(filename.decode())
答案 2 :(得分:0)
使用compat中的as_text函数(来自tensorflow.python.util)来转换tensorflow的字节字符串。即
文件名= compat.as_text(文件名)
答案 3 :(得分:0)
在tensorflow 2.0.0中,可以通过以下方式完成:
import tensorflow as tf
my_str = tf.constant('Hello World')
my_str_npy = my_str.numpy()
print(my_str_npy)
type(my_str_npy)
这会将字符串张量转换为'bytes'类的字符串
答案 4 :(得分:0)
在数据集中,您可以通过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