KeyError问题:“ val_acc”

时间:2019-10-30 18:24:46

标签: python keras deep-learning

这是一个非常普遍的错误,但是根据我的设置,我找不到正确的答案。 我找到了此教程代码,但是在运行时出现此错误:

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)

1 个答案:

答案 0 :(得分:1)

您好,在这里写我的建议,因为我还无法发表评论,

您说对了,功能fit_generator()没有验证拆分属性。 因此,您需要创建自己的验证数据集,并通过validation_data=(val_X, val_y)将其提供给拟合生成器,例如:

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中的方法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)

查看here了解更多信息。

或者,您可以编写自己的split方法:)

编辑2

如果您无法使用train_test split并假设您有一个名为train_data的熊猫数据框,其中的功能部件和标签一起:

val_data=train_data.sample(frac=0.33,random_state=1)

这将创建一个包含33%数据的验证数据集和一个包含77%数据的火车数据集。

Edit3

事实证明您正在使用ImageDataGenerator()创建数据。这非常方便,因为可以在初始化ImageDataGenerator()时通过validation_split=设置验证百分比,如文档(here)所示。看起来应该像这样:

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)

让我知道这是否可以解决您的问题:)