#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 .