Python 3.x Tensorflow 1.12 tf.data.Dataset.map()存在问题-使用tf.data API加载图像文件
我正在尝试使用tf.data API将图像数据集加载到GPU上,因为它们提供了优化的性能。但遗憾的是,使用tf.data.Dataset.map()函数不会返回与model.fit()或model.fit\u生成器()兼容的数据集。 假设目录树与keras ImageDataGenerator所需的目录树相同Python 3.x Tensorflow 1.12 tf.data.Dataset.map()存在问题-使用tf.data API加载图像文件,python-3.x,tensorflow,tensorflow-datasets,tf.data.dataset,Python 3.x,Tensorflow,Tensorflow Datasets,Tf.data.dataset,我正在尝试使用tf.data API将图像数据集加载到GPU上,因为它们提供了优化的性能。但遗憾的是,使用tf.data.Dataset.map()函数不会返回与model.fit()或model.fit\u生成器()兼容的数据集。 假设目录树与keras ImageDataGenerator所需的目录树相同 files = [os.path.join(train_dir, file) for file in os.listdir(train_dir)] val_files = [os.path
files = [os.path.join(train_dir, file) for file in os.listdir(train_dir)]
val_files = [os.path.join(val_dir, file) for file in os.listdir(val_dir)]
def get_data_train(file_path: str) -> tuple:
mask_path = tf.strings.regex_replace(file_path, '.jpg$', '.png')
mask_path = tf.strings.regex_replace(mask_path, 'Images', 'Label', replace_global=False)
mask = tf.io.read_file(mask_path)
mask = tf.image.decode_png(mask, channels=1)
mask = tf.image.resize_image_with_pad(mask, target_height=544, target_width=960)
image = tf.io.read_file(file_path)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize_image_with_pad(image, target_height=544, target_width=960)
if tf.random.uniform(shape=(), minval=0, maxval=1, dtype=tf.float32) > 0.5:
image = tf.image.flip_left_right(image)
mask = tf.image.flip_left_right(mask)
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
mask = tf.image.convert_image_dtype(mask, dtype=tf.float32)
return image / 255., mask[:, :, 0] / 255.
def get_data_validation(file_path: str) -> tuple:
mask_path = tf.strings.regex_replace(file_path, '.jpg$', '.png')
mask_path = tf.strings.regex_replace(mask_path, 'Images', 'Label', replace_global=False)
mask = tf.io.read_file(mask_path)
mask = tf.image.decode_png(mask, channels=1)
mask = tf.image.resize_image_with_pad(mask, target_height=544, target_width=960)
image = tf.io.read_file(file_path)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize_image_with_pad(image, target_height=544, target_width=960)
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
mask = tf.image.convert_image_dtype(mask, dtype=tf.float32)
return image / 255., mask[:, :, 0] / 255.
def configure_for_performance(dataset: tf.data.Dataset):
dataset = dataset.cache()
dataset = dataset.shuffle(buffer_size=8)
dataset = dataset.batch(args.batch_size)
dataset = dataset.prefetch(buffer_size=8)
return dataset
train_ds = tf.data.Dataset.from_tensor_slices(files)
train_ds = train_ds.map(lambda inputs: tf.py_func(get_data_train, [inputs], Tout=[tf.float32, tf.float32]))
val_ds = tf.data.Dataset.from_tensor_slices(val_files)
val_ds = val_ds.map(lambda inputs: tf.py_func(get_data_validation, [inputs], Tout=[tf.float32, tf.float32]))
val_ds = val_ds.map(lambda x: x.set_shape([None, 544, 960, 3], [None, 544, 960]))
train_ds = configure_for_performance(train_ds)
val_ds = configure_for_performance(val_ds)
当我使用model.fit()函数时,出现了这个错误
然后是未知秩张量的model.fit()。在我的研究中,tf.py_func()会导致形状数据丢失,因此需要设置形状
我正在尝试使用tf.data API加载Cityscapes数据集的图像文件
谢谢tf.py_函数将不允许您使用GPU,这里对tf.py_函数的文档进行了解释 也许你应该为你的地图写一个函数
def fct_for_map(img):
#your code
return my_tensor
在你尝试之后
train_ds = train_ds.map(fct_for_map)
我希望这能帮助您当我用tf.py_func()对tf.dataset.map()的输入进行字体包装时,会出现这样的错误如果tf.random.uniform(shape=(),minval=0,maxval=1,dtype=tf.float32)>0.5:raise TypeError(“不允许将
tf.Tensor
用作Pythonbool
。”TypeError:不允许将tf.Tensor
用作Pythonbool
。如果t不是None,则使用而不是if t:
来测试是否定义了张量,并使用诸如tf.cond之类的TensorFlow操作来执行以张量值为条件的子图。TypeError:“NoneType”对象不可调用``我认为这是一错误之所以出现反操作,是因为get\u train\u数据中的tf.random.uniform()函数不像train\u ds.map那样被急切地执行
def fct_for_map(img):
#your code
return my_tensor
train_ds = train_ds.map(fct_for_map)