【问题标题】:How to train a Keras autoencoder with custom dataset?如何使用自定义数据集训练 Keras 自动编码器?
【发布时间】:2021-03-30 14:38:03
【问题描述】:

我正在阅读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'].

任何想法我在这里缺少什么?

【问题讨论】:

  • autoencoder 是否正常工作,没有您的自定义数据集? (同时遵循 tuts)?
  • 在教程中说你应该适应 #train the convolutional autoencoder H = autoencoder.fit( trainX, trainX, validation_data=(testX, testX), epochs=EPOCHS, batch_size=BS),但你适合发电机。换句话说,我认为您没有提供 Y/target,对于自动编码器来说,它与输入相同。所以你应该有 fit(train_gen, train_gen, val_gen, val_gen, EPOCHS=[...]) 但确保生成器在运行两次时以相同的顺序提供图像
  • @Octav 当我使用像fit(train_gen, train_gen, val_gen, val_gen, epochs=EPOCHS, batch_size=BS) 这样的代码时,我收到以下错误:“fit() got multiple values for argument 'epochs'”。
  • autoencoder.fit(train_gen, train_gen, validation_data=(val_gen, val_gen), epochs=EPOCHS, batch_size=BS)
  • @Octav 这会导致以下错误:“使用keras.utils.Sequence 作为输入时不支持y 参数。”

标签: python tensorflow keras


【解决方案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:“分类”、“二进制”、“稀疏”之一, “输入”,或无。默认值:“分类”。 确定返回的标签数组的类型:- “分类”将是 2D one-hot 编码标签,-“二进制”将 是一维二进制标签,“稀疏”将是一维整数标签,-“输入” 将是与输入图像相同的图像(主要用于 自动编码器)。 - 如果为 None,则不返回任何标签(生成器 只会产生一批图像数据,这对于与 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)

【讨论】:

  • 谢谢,这解决了我的问题。但现在我从fit() 得到以下异常:“Fused conv implementation 目前不支持分组卷积。”有什么想法吗?
  • 来自 SO stackoverflow.com/questions/61796021/… 的一些评论,也许您应该检查图像 3 的通道(在模型 ConvAutoencoder.build(SHAPE[0], SHAPE[1], 3 中准备) ),而不是灰度(1 通道)。从 flow_from_directory 中,我看到默认值为 rgb,因此它符合您的模型的期望...也许强制它为 rgb 并检查您的原始图像是否为灰度,并且不知何故 flow_from_directory 不符合我们的预期。
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 2021-04-05
  • 2022-06-29
  • 2019-01-21
相关资源
最近更新 更多