Построение кривой обучения в keras дает ошибку ключа: ‘val_acc’

#python #machine-learning #classification #pattern-recognition

#python #машинное обучение #классификация #распознавание шаблонов

Вопрос:

Я пытался построить кривую обучения и тестирования в keras, однако выдает следующий код KeyError: 'val_acc error .

В официальном документе <https://keras.io/callbacks/> говорится, что для использования 'val_acc' мне нужно включить проверку и мониторинг точности, которые я не понимаю и не знаю, как использовать в своем коде.

Любая помощь будет высоко оценена. Спасибо.

 seed = 7
np.random.seed(seed)

dataframe = pandas.read_csv("iris.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:4].astype(float)
Y = dataset[:,4]

encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
dummy_y = np_utils.to_categorical(encoded_Y)

kfold = StratifiedKFold(y=Y, n_folds=10, shuffle=True, random_state=seed)
cvscores = []

for i, (train, test) in enumerate(kfold):

    model = Sequential()
    model.add(Dense(12, input_dim=4, init='uniform', activation='relu'))
    model.add(Dense(3, init='uniform', activation='sigmoid'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    history=model.fit(X[train], dummy_y[train], nb_epoch=200, batch_size=5, verbose=0)
    scores = model.evaluate(X[test], dummy_y[test], verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
    cvscores.append(scores[1] * 100)

print( "%.2f%% ( /- %.2f%%)" % (np.mean(cvscores), np.std(cvscores))) 


print(history.history.keys())
# summarize history for accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
  

Ответ №1:

Похоже, в Keras Tensorflow 2.0 val_acc был переименован в val_accuracy

Комментарии:

1. Какой смысл делать подобные вещи, кроме как доставлять всем много неприятностей?

Ответ №2:

 history_dict = history.history
print(history_dict.keys())
  

если вы напечатаете ключи history_dict , вы получите вот так dict_keys(['loss', 'acc', 'val_loss', 'val_acc']) .

и отредактируйте код следующим образом

 acc = history_dict['acc']
val_acc = history_dict['val_acc']
loss = history_dict['loss']
val_loss = history_dict['val_loss']
  

Ключи и ошибка

Комментарии:

1. Пожалуйста, добавьте ссылку на официальный документ для справки. Пока это нормально, но все же.

2. Я столкнулся с этим prblm, и я нашел это. Просто найдите тип «history_dict «. это будет словарь, что означает, что у dict есть ключи и значение. поэтому попробуйте напечатать ключи, а также значение. если вы напечатаете «print(history_dict.keys())», вы получите dict_keys([‘loss’, ‘acc’, ‘val_loss’, ‘val_acc’]) этот вывод. итак, объект истории содержит словарь. в этом словаре у нас есть ключи [‘loss’, ‘acc’, ‘val_loss’, ‘val_acc’]. для этих ключей у нас есть значения. таким образом, мы можем построить график с использованием ключей (в dict мы можем использовать значения только с помощью ключей).

Ответ №3:

Возможно, вам потребуется включить разделение проверки вашего набора поездов. Обычно проверка выполняется в 1/3 набора обучающих программ. В вашем коде внесите изменения, как указано ниже:

 history=model.fit(X[train], dummy_y[train],validation_split=0.33,nb_epoch=200, batch_size=5, verbose=0) 
  

Это работает!

Ответ №4:

Главное, что все упускают из виду, это то, что эта ключевая ошибка связана с присвоением метрик во model.compile(...) время . Вы должны соответствовать тому, как вы называете свою метрику точности внутри model.compile(....,metrics=['<metric name>']) . Ваш объект обратного вызова истории получит словарь, содержащий пары ключ-значение, как определено в метриках.

Итак, если ваша метрика равна metrics=['acc'] , вы можете получить к ним доступ в объекте истории с history.history['acc'] помощью, но если вы определяете метрику как metrics=['accuracy'] , вам нужно изменить на history.history['accuracy'] , чтобы получить доступ к значению, чтобы избежать ключевой ошибки. Надеюсь, это поможет.

Примечание. Вот ссылка на метрики, которые вы можете использовать в Keras.

Комментарии:

1. Отличный ответ. В моем случае у меня было несколько keras.metrics.Precision() классов, и я не мог понять, почему я получаю val_precision_1 , val_precision_2 , и тому подобное… этот комментарий решает проблему. Я должен дать одно и то же имя каждому классу keras.metrics.Percision(name='precision') , чтобы рассчитывать на то, что этот ключ присутствует в объекте истории.

Ответ №5:

Если вы обновите более старую версию keras (например, 2.2.5) до 2.3.0 (или новее), которая совместима с Tensorflow 2.0, у вас может возникнуть такая ошибка (например, KeyError: ‘acc’). Оба acc и val_acc были переименованы в accuracy и val_accuracy соответственно. Переименование их в скрипте решит проблему.

Ответ №6:

чтобы получить любые данные val_ * ( val_acc , val_loss , …), вам нужно сначала установить проверку.

первый метод (будет проверяться на основе того, что вы ему даете):

 model.fit(validation_data=(X_test, Y_test))
  

второй метод (будет проверяться на основе части обучающих данных):

 model.fit(validation_split=0.5) 
  

Ответ №7:

Я изменил соответствие точности, и моя проблема решена. Tensorflow 2

например

 accuracy = history_dict['accuracy']
val_accuracy = history_dict['val_acccuracy']
  

Ответ №8:

Эта ошибка также возникает, когда вы указываете validation_data=(X_test, Y_test) , что и ваши X_test и / или Y_test пусты. Чтобы проверить это, выведите форму X_test и Y_test соответственно. В этом случае model.fit(validation_data=(X_test, Y_test), ...) метод выполнялся, но поскольку набор проверки был пустым, он не создал ключ словаря для val_loss в history.history словаре.

Ответ №9:

То, что сработало для меня, изменилось objective='val_accuracy' на objective=["val_accuracy"] in

 tuner = kt.BayesianOptimization(model_builder,
                         objective=["val_accuracy"],
                         max_trials=80,
                         seed=123) 
tuner.search(X_train, y_train, epochs=50, validation_split=0.2)
  

У меня есть TensorFlow 2 .