Python 3.x Tensorflow 1.12 tf.data.Dataset.map()存在问题-使用tf.data API加载图像文件

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

我正在尝试使用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.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
用作Python
bool
。”TypeError:不允许将
tf.Tensor
用作Python
bool
。如果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)