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

Python 如何使用自定义数据集训练Keras自动编码器?,python,tensorflow,keras,Python,Tensorflow,Keras,我阅读是为了基于Keras创建我自己的自动编码器。我一步一步地遵循教程,唯一的区别是我想使用自己的图像数据集来训练模型。因此,我更改/添加了以下代码: IMAGES=“/path/to/my/IMAGES” 形状=(200200) 初始值=1e-3 纪元=20 BS=32 (编码器、解码器、自动编码器)=ConvAutoencoder.build(形状[0],形状[1],3) opt=Adam(lr=INIT_lr,decay=INIT_lr/EPOCHS) 编译(loss=“mse”,opt

我阅读是为了基于Keras创建我自己的自动编码器。我一步一步地遵循教程,唯一的区别是我想使用自己的图像数据集来训练模型。因此,我更改/添加了以下代码:


IMAGES=“/path/to/my/IMAGES”
形状=(200200)
初始值=1e-3
纪元=20
BS=32
(编码器、解码器、自动编码器)=ConvAutoencoder.build(形状[0],形状[1],3)
opt=Adam(lr=INIT_lr,decay=INIT_lr/EPOCHS)
编译(loss=“mse”,optimizer=opt)
图像生成器=图像数据生成器(重缩放=1.0/255)
train\u gen=image\u generator.flow\u from\u目录(
加入(图像,“培训”),
类别模式=无,目标尺寸=形状,批次尺寸=BS,
)
val\u gen=image\u generator.flow\u from\u目录(
join(图像,“验证”),
类别模式=无,目标尺寸=形状,批次尺寸=BS,
)
hist=自动编码器.fit(序列生成,验证数据=val生成,年代=年代,批次大小=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'].
你知道我这里缺少什么吗?

在flow\u from\u目录中使用class\u mode=“input”,这样返回的Y将与X相同

类别模式:属于“分类”、“二进制”、“稀疏”模式之一, “输入”,或无。默认值:“分类”。 确定返回的标签数组的类型:- “分类”将是2D-one热编码标签,“二进制”将 是1D二进制标签,“稀疏”将是1D整数标签,-“输入” 图像将与输入图像相同(主要用于 自动编码器)。-如果没有,则不返回标签(生成器) 将只生成成批的图像数据,这对与一起使用很有用
model.predict()
)。请注意,如果 class_mode None,数据仍然需要驻留在子目录中 目录,以使其正常工作

代码应该以如下方式结束:

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)

自动编码器
是否正常工作,没有自定义数据集?(在遵循tuts时)?在教程中,它说您应该安装#训练卷积自动编码器H=autoencoder.fit(trainX,trainX,validation_data=(testX,testX),epochs=epochs,batch_size=BS),但您可以安装在生成器上。换句话说,我不认为您提供了Y/目标,对于autoencoder,它与输入相同。因此,您应该有fit(train_gen、train_gen、val_gen、val_gen、EPOCHS=[…]),但确保生成器在运行时以相同的顺序提供图像twice@Octav当我使用像
fit(train\u gen,train\u gen,val\u gen,val\u gen,epochs=epochs,batch\u size=BS)这样的代码时,
我得到以下错误:“fit()为参数'epochs'获取了多个值”.autoencoder.fit(train_gen,train_gen,validation_data=(val_gen,val_gen),epochs=epochs,batch_size=BS)@Octav导致以下错误:“
y
参数在使用
keras.utils.Sequence
作为输入时不受支持。”谢谢,这样解决了我的问题。但是现在我从
fit()
中得到了以下例外:“Fused conv实现目前不支持分组卷积。”有什么想法吗?根据一些评论,也许您应该检查图像的通道3(如模型ConvAutoencoder.build(形状[0],形状[1],3]),而不是灰度(1通道)。从flow_From_目录中,我看到默认值是rgb,因此它符合您模型的期望。。。也许可以强制它为rgb,然后检查您的原始图像是否为灰度级,并且不知何故,来自目录的流并没有达到我们期望的效果。太好了,非常感谢!