我正在阅读 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'].
知道我在这里缺少什么吗?
答案 0 :(得分:1)
在 flow_from_directory 使用 class_mode="input" 这样返回的 Y 将与 X 相同
<块引用>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)