Проблемы с KeyError: 'val_acc' - PullRequest
       12

Проблемы с KeyError: 'val_acc'

0 голосов
/ 30 октября 2019

Это довольно распространенная ошибка, но я не смог найти правильный ответ, учитывая мои настройки. Я нашел этот учебный код, но при запуске я получаю эту ошибку:

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 Ответ

1 голос
/ 31 октября 2019

Привет, я пишу свои предложения здесь, потому что я пока не могу комментировать,

Вы правы, у функции 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)

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ

Чтобы получить проверочный набор данных из ваших данных, вы можете использовать метод train_test_split() из sklearn. Например, разделение с 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, и предполагается, что у вас есть фрейм данных pandas с именем 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)

Дайте мне знать, если это решит вашу проблему:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...