这是一个相当普遍的错误,但我没有找到一个正确的答案,因为我的设置。我找到了这个教程代码,但是在运行时,我得到了以下错误:
val_acc = history.history['val_acc']
KeyError: 'val_acc'fit_generator()函数与fit()不同,不允许进行验证分割。那怎么解决呢?
以下是代码:
def plot_training(history):
print (history.history.keys())
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'r.')
plt.plot(epochs, val_acc, 'r')
plt.title('Training and validation accuracy')
# plt.figure()
# plt.plot(epochs, loss, 'r.')
# plt.plot(epochs, val_loss, 'r-')
# plt.title('Training and validation loss')
plt.show()
plt.savefig('acc_vs_epochs.png')
#....
finetune_model = build_finetune_model(base_model, dropout=dropout, fc_layers=FC_LAYERS, num_classes=len(class_list))
adam = Adam(lr=0.00001)
finetune_model.compile(adam, loss='categorical_crossentropy', metrics=['accuracy'])
filepath="./checkpoints/" + "ResNet50" + "_model_weights.h5"
checkpoint = ModelCheckpoint(filepath, monitor=["acc"], verbose=1, mode='max')
callbacks_list = [checkpoint]
history = finetune_model.fit_generator(train_generator, epochs=NUM_EPOCHS, workers=8,
steps_per_epoch=steps_per_epoch,
shuffle=True, callbacks=callbacks_list)
plot_training(history)发布于 2019-10-31 09:57:52
嗨,我在这里写了一些建议,因为我还不能发表评论,
您是对的,函数fit_generator()没有验证拆分属性。因此,您需要创建自己的验证数据集,并通过validation_data=(val_X, val_y)将其提供给fit生成器,如:
history = finetune_model.fit_generator(train_generator, epochs=NUM_EPOCHS, workers=8, validation_data=(val_X, val_y),
steps_per_epoch=steps_per_epoch,
shuffle=True, callbacks=callbacks_list)希望这能有所帮助。
编辑
要从数据中获取验证数据集,可以使用sklearn中的methode train_test_split()。例如,有77%的训练数据和33%的验证数据的拆分:
X_train, val_X, y_train, val_y= train_test_split(
X, y, test_size=0.33, random_state=42)有关更多信息,请访问这里。
或者,您可以编写自己的拆分方法:)
编辑2
如果您没有可能使用train_test split,并且假设您有一个名为train_data的熊猫数据中心,并将这些功能和标签放在一起:
val_data=train_data.sample(frac=0.33,random_state=1)这将创建一个包含33%数据的验证数据集和一个包含77%数据的列车数据集。
Edit3
事实证明,您正在使用ImageDataGenerator()创建数据。这非常方便,因为您可以通过validation_split=设置验证百分比,同时初始化文档(这里)中的ImageDataGenerator()。这个应该是这样的:
train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input,
validation_split=0.33)在此之后,您需要两个“生成”数据集。一个用来训练,一个用来做你的验证。这应如下所示:
train_generator = train_datagen.flow_from_directory(TRAIN_DIR,
target_size=(HEIGHT, WIDTH),
batch_size=BATCH_SIZE,subset="training")
validation_generator = train_datagen.flow_from_directory(TRAIN_DIR,
target_size=(HEIGHT, WIDTH),
batch_size=BATCH_SIZE,subset="validation")最后,您可以在fit_generator中使用这两种设置,如下所示:
history = finetune_model.fit_generator(train_generator,epochs=NUM_EPOCHS, workers=8,
validation_data=validation_generator, validation_steps = validation_generator.samples,steps_per_epoch=steps_per_epoch,
shuffle=True, callbacks=callbacks_list)如果这解决了你的问题,请告诉我:)
https://stackoverflow.com/questions/58631614
复制相似问题