Tensorflow Keras在培训和验证中提供了不同数量的类别
我正在使用Keras内置的Resnet(添加到sequential中)和数据生成器构建一个图像分类器。图像存储在单独的文件夹中,文件夹充当类 问题是训练数据集中有464个类,而验证数据集中有683个。因此,当我跑步时: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
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,允许我在不接触单独数据集的情况下进行验证?您需要为验证集维护一个数据框,该数据框仅由经过培训的类组成。稍后,您可以使用KerasImageDataGenerator的flow\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等。