Tensorflow 加载未标记的本地数据

Tensorflow loading unlabeled local data

比方说,我正在训练一个自动编码器(所以我需要定义输入数据集,以及目标输出)。我需要一个只有图像(没有标签)的数据集。

我试过使用flow_from_directory(),但是它给数据集分配了一个class,当传递给训练时,它会与目标数据发生冲突,产生错误。

所以我想我需要的是将我的本地图像转换为具有类似 tensorflow_datasets.mnist.

结构的数据集

文件夹结构:

/data
  /low
    -0.png
    -1.png
    -...
  /high
    -0.png
    -1.png
    -...

我尝试过的:

low_generator = keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255.0,
    validation_split=0.2
)

# when path is directly to the image folder - no images found
# when path is to parent folder, specifying which folder to use - it assigns labels too
train_low_iterator = low_generator.flow_from_directory(
    # 'path to parent directory'
    'path to directory',
    target_size=(480, 270),
    batch_size=10,
    class_mode='input',
    subset='training',
    # add this when path is to parent
    # classes=['low']
)

validation_low_iterator = low_generator.flow_from_directory(
    'same as above',
    target_size=(480, 270),
    batch_size=10,
    class_mode='input',
    subset='validation',
    # same as above
    classes=['low']
)

# analogic to above
high_generator
train_high_iterator
validation_high_iterator

Class_mode None

源代码说,如果 None 用作 class_mode,它不会产生标签。 Source

但是这些例子都没有用(和以前一样的问题,要么什么都找不到,要么再次产生标签:

iterator = generator.flow_from_directory(
    'parent_path',
    class_mode=None,
    classes=['something']
)
iterator = generator.flow_from_directory(
    'parent_path',
    classes=['something']
)
iterator = generator.flow_from_directory(
    'direct_path',
    class_mode=None
)
iterator = generator.flow_from_directory(
    'direct_path'
)

我也试过了image_dataset_from_directory()

train_low_dataset = keras.utils.image_dataset_from_directory(
    'path/low',
    labels = None,
    label_mode = None,
    color_mode = 'rgb',
    batch_size = 32,
    image_size = (480, 270),
    shuffle = False,
    validation_split = 0.2,
    subset = 'training'
)

这能够加载所有数据,return 一个数据集,但它会抛出一个错误(在训练开始时):

raise ValueError("'y' argument is not supported when using " ValueError: 'y' argument is not supported when using python generator as input.

我现在无法解决(因为我需要同时使用输入和输出数据,以及训练和验证)。

培训

model.fit(
    train_low_iterator, train_high_iterator,
    epochs=15,
    batch_size=8,
    shuffle=True,
    validation_data=(validation_low_iterator, validation_high_iterator)
)

我尝试创建一个自定义生成器函数(一个奇特的 for 循环,最后带有 yield),但没有成功(我会在以后重试,如果有的话我会更新这个答案我让它正常工作)。

想通了:

然而,生成器对象转换为 numpy array

文件夹结构与问题中的相同。

正在创建迭代器

low = np.array([cv2.imread(f.path) / 255 for f in os.scandir("/data/low")])
high = np.array([cv2.imread(f.path) / 255 for f in os.scandir("/data/high")])

train_low = low[:205]
validate_low = low[205:]
train_high = high[:205]
validate_out = high[205:]

培训

model.fit(x=train_low, y=train_high,
    epochs=10,
    batch_size=1,
    shuffle=True,
    validation_data=(validate_low, validate_high),
)