【问题标题】:Tensorflow image_dataset_from_directory for input dataset and output dataset输入数据集和输出数据集的 TensorFlow image_dataset_from_directory
【发布时间】:2020-12-07 01:13:35
【问题描述】:

我正在尝试学习图像自动编码,但我无法使用输入和输出图像来训练模型

例如: 输入图像文件夹:“.../图片/输入”
输出图像文件夹:“.../图片/输出”

#get input images from data_dir_input
ds_input = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir_input,
    seed=123,
    image_size=(img_height, img_width),
    label_mode=None,
    batch_size=batch_size)

#get output images from data_dir_output
ds_output = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir_output,
    seed=123,
    image_size=(img_height, img_width),
    label_mode=None,
    batch_size=batch_size)

# --------- model init etc --------------
# ...


model.fit(x=ds_input, y=ds_output, batch_size=32, epochs=50)

但我说这个时出错:

`y` argument is not supported when using dataset as input

如何在训练模型时使用自己的输入图像和输出图像?

【问题讨论】:

    标签: python tensorflow image-processing keras autoencoder


    【解决方案1】:

    您可以使用tf.data.Dataset 以获得更大的灵活性。根据我的阅读,image_dataset_from_directory 不支持除整数以外的任何自定义标签。

    试试这个:

    import os
    import tensorflow as tf
    os.chdir(r'c:/users/user/Pictures')
    from glob2 import glob
    
    x_files = glob('inputs/*.jpg')
    y_files = glob('targets/*.jpg')
    
    files_ds = tf.data.Dataset.from_tensor_slices((x_files, y_files))
    
    def process_img(file_path):
        img = tf.io.read_file(file_path)
        img = tf.image.decode_jpeg(img, channels=3)
        img = tf.image.convert_image_dtype(img, tf.float32)
        img = tf.image.resize(img, size=(28, 28))
        return img
    
    files_ds = files_ds.map(lambda x, y: (process_img(x), process_img(y))).batch(1)
    
    original, target = next(iter(files_ds))
    
    <tf.Tensor: shape=(1, 28, 28, 3), dtype=float32, numpy=
    array([[[[0.357423  , 0.3325731 , 0.20412168],
             [0.36274514, 0.21940777, 0.17623049],
             [0.34821934, 0.13921566, 0.06858743],
             ...,
             [0.25486213, 0.27446997, 0.2520612 ],
             [0.04925931, 0.26666668, 0.07619007],
             [0.48167226, 0.5287311 , 0.520888  ]]]
    

    那么您就不需要将y 传递给fit() 调用。您将可以这样使用它:

    model.fit(ds, epochs=5)
    

    【讨论】:

    • 感谢您的回复,但我的输入和输出目录不同,因此我无法为两者传递相同的图像
    • 好的,我在编辑我的答案时考虑到了这个约束。然后,您只需要获取 x 和 y 的匹配文件列表。只需将os.listdir() 替换为对您的任务有意义的文件列表即可。确保使用相应的 y 正确排序。
    • 当我使用新代码块时,我收到此错误OP_REQUIRES failed at whole_file_read_ops.cc:116 : Not found: NewRandomAccessFile failed to Create/Open: 000128_17.png : The system cannot find the file specified(顺便说一句,我将 decode_jpeg 更改为 decode_png)
    • 这可能是因为'000128_17.png' 没有文件夹名称。我用glob2.glob 给你做了一个例子,它会处理这个问题
    • 这很有效,谢谢,我可以像重新缩放、旋转等一样扩充这个数据集吗? image_dataset_from_directory 对增强有一些用途,但我也对这种方法很好奇
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2021-08-10
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多