如何使用自定义数据集训练 Keras 自动编码器?

时间:2021-03-30 14:38:03

标签: python tensorflow keras

我正在阅读 this tutorial 以创建我自己的基于 Keras 的自动编码器。我一步一步地跟着教程,唯一的区别是我想用我自己的图像数据集来训练模型。所以我更改/添加了以下代码:


IMAGES = "/path/to/my/images"
SHAPE = (200, 200)
INIT_LR = 1e-3
EPOCHS = 20
BS = 32

(encoder, decoder, autoencoder) = ConvAutoencoder.build(SHAPE[0], SHAPE[1], 3)
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
autoencoder.compile(loss="mse", optimizer=opt)

image_generator = ImageDataGenerator(rescale=1.0 / 255)
train_gen = image_generator.flow_from_directory(
    os.path.join(IMAGES, "training"), 
    class_mode=None, target_size=SHAPE, batch_size=BS,
)
val_gen = image_generator.flow_from_directory(
    os.path.join(IMAGES, "validation"), 
    class_mode=None, target_size=SHAPE, batch_size=BS,
)

hist = autoencoder.fit(train_gen, validation_data=val_gen, epochs=EPOCHS, batch_size=BS)

我的图像是 RGB 格式的普通 .jpg 文件。但是,一旦训练开始,fit() 方法就会抛出以下异常:

ValueError: No gradients provided for any variable: ['conv2d/kernel:0', 'conv2d/bias:0', 'batch_normalization/gamma:0', 'batch_normalization/beta:0', 'conv2d_1/kernel:0', 'conv2d_1/bias:0', 'batch_normalization_1/gamma:0', 'batch_normalization_1/beta:0', 'dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0', 'conv2d_transpose/kernel:0', 'conv2d_transpose/bias:0', 'batch_normalization_2/gamma:0', 'batch_normalization_2/beta:0', 'conv2d_transpose_1/kernel:0', 'conv2d_transpose_1/bias:0', 'batch_normalization_3/gamma:0', 'batch_normalization_3/beta:0', 'conv2d_transpose_2/kernel:0', 'conv2d_transpose_2/bias:0'].

知道我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:1)

在 flow_from_directory 使用 class_mode="input" 这样返回的 Y 将与 X 相同

https://github.com/tensorflow/tensorflow/blob/v2.4.1/tensorflow/python/keras/preprocessing/image.py#L867-L958

<块引用>

class_mode:“分类”、“二进制”、“稀疏”之一, “输入”,或无。默认值:“分类”。 确定返回的标签数组的类型:- “分类”将是二维单热编码标签,-“二进制”将 是一维二进制标签,“稀疏”将是一维整数标签,-“输入” 将是与输入图像相同的图像(主要用于处理 自动编码器。 - 如果没有,则不返回标签(生成器 只会产生成批的图像数据,这对于与 model.predict())。请注意,如果 class_mode 无,数据仍需驻留在子目录中 directory 才能正常工作。

代码应该是这样的:

image_generator = ImageDataGenerator(rescale=1.0 / 255)
train_gen = image_generator.flow_from_directory(
    os.path.join(IMAGES, "training"), 
    class_mode="input", target_size=SHAPE, batch_size=BS,
)
val_gen = image_generator.flow_from_directory(
    os.path.join(IMAGES, "validation"), 
    class_mode="input", target_size=SHAPE, batch_size=BS,
)
hist = autoencoder.fit(train_gen, validation_data=val_gen, epochs=EPOCHS, batch_size=BS)