【发布时间】:2020-02-07 17:14:58
【问题描述】:
他们已经有 2 篇关于此主题的帖子,但尚未针对最近的 TF2.1 版本进行更新...
简而言之,我有很多 tif 图像要使用特定管道读取和解析。
import tensorflow as tf
import numpy as np
files = # a list of str
labels = # a list of int
n_unique_label = len(np.unique(labels))
gen = functools.partial(generator, file_list=files, label_list=labels, param1=x1, param2=x2)
dataset = tf.data.Dataset.from_generator(gen, output_types=(tf.float32, tf.int32))
dataset = dataset.map(lambda b, c: (b, tf.one_hot(c, depth=n_unique_label)))
此处理效果很好。不过,我需要并行化文件解析部分,尝试以下解决方案:
files = # a list of str
files = tensorflow.data.Dataset.from_tensor_slices(files)
def wrapper(file_path):
parser = partial(tif_parser, param1=x1, param2=x2)
return tf.py_function(parser, inp=[file_path], Tout=[tf.float32])
dataset = files.map(wrapper, num_parallel_calls=2)
不同之处在于我在这里使用parser 函数一次解析一个文件。但是,它不起作用:
File "loader.py", line 643, in tif_parser
image = numpy.array(Image.open(file_path)).astype(float)
File "python3.7/site-packages/PIL/Image.py", line 2815, in open
fp = io.BytesIO(fp.read())
AttributeError: 'tensorflow.python.framework.ops.EagerTensor' object has no attribute 'read'
[[{{node EagerPyFunc}}]] [Op:IteratorGetNextSync]
据我了解,tif_parser 函数接收的不是字符串而是(未计算的)张量。目前,这个函数相当简单:
def tif_parser(file_path, param1=1, param2=2):
image = numpy.array(Image.open(file_path)).astype(float)
image /= 255.0
return image
【问题讨论】:
标签: python-3.x tensorflow tensorflow2.0 tensorflow-datasets