Tensorflow Keras在培训和验证中提供了不同数量的类别

Tensorflow Keras在培训和验证中提供了不同数量的类别,tensorflow,keras,tensorflow-datasets,Tensorflow,Keras,Tensorflow Datasets,我正在使用Keras内置的Resnet(添加到sequential中)和数据生成器构建一个图像分类器。图像存储在单独的文件夹中,文件夹充当类 问题是训练数据集中有464个类,而验证数据集中有683个。因此,当我跑步时: model.fit_generator( train_datagen, steps_per_epoch = STEP_SIZE_TRAIN, epochs = EPOCHS, verbose = 1, callbacks = [cp_ca

我正在使用Keras内置的Resnet(添加到sequential中)和数据生成器构建一个图像分类器。图像存储在单独的文件夹中,文件夹充当类

问题是训练数据集中有464个类,而验证数据集中有683个。因此,当我跑步时:

model.fit_generator(
    train_datagen, 
    steps_per_epoch = STEP_SIZE_TRAIN,
    epochs = EPOCHS,
    verbose = 1,
    callbacks = [cp_callback, cp_tensorboard],
    validation_data = val_datagen,
    validation_freq = 2
)
我得到了错误

ValueError: Error when checking target: expected dense_2 to have shape (464,) but got array with shape (683,)
这是有道理的;在训练集中训练的模型无法评估它没有节点的类。不过,是否可以修改我的模型或数据集划分来解决此问题


或者,是否有一种方法可以使用数据生成器的validation\u split,允许我在不接触单独数据集的情况下进行验证?

您需要为验证集维护一个数据框,该数据框仅由经过培训的类组成。稍后,您可以使用KerasImageDataGeneratorflow\u from\u dataframe功能来解决您的问题。 您可以按照下面的代码操作

images = []
classes = []
#To filter classes from validation set 
for i in train_classes:
  image_list = os.listdir("Validation/" + i + "/") 
  cl = [i] * len (image_list)
  images.extend(image_list)
  classes.extend(cl)

val_df = pd.DataFrame({"Images":images, "Classes":classes})

val_datgen = ImageDataGenerator(rescale=1./255)

validation_generator = val_datagen.flow_from_dataframe(
        dataframe=val_df,
        directory='Validation',
        x_col="Images",
        y_col="Classes",
        target_size=(150, 150),
        batch_size=32,
        class_mode='categorical')

其中train_classes是培训数据中的类列表。

您应该拥有培训数据集中所有类的数据,否则就没有意义,您将无法预测不在培训数据中的类。使用numpy筛选验证数据,并仅使用与列车数据具有相同标签的样本。你的模型只能预测它在火车上看到的类的样本。@Augustomillo但是我如何过滤生成器的输出呢?我是否需要创建自己的自定义生成器而不是使用内置的ImageDataGenerator类来读取验证数据?您可以在定义ImageDataGenerator之前创建自己的自定义生成器或筛选数据。使用numpy筛选数据。检查np.where、np.any等。