ケラスでトレーニングとテストの学習曲線をプロットしようとしていましたが、次のコードは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()
Keras + Tensorflow 2.0のようですval_acc
はval_accuracy
に名前が変更されました
トレインセットの検証分割を有効にする必要がある場合があります。通常、検証はトレインセットの1/3で行われます。コードで、以下のように変更を加えます。
history=model.fit(X[train], dummy_y[train],validation_split=0.33,nb_Epoch=200, batch_size=5, verbose=0)
できます!
_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']
_
誰もが言及し忘れている主な点は、これKey Errorがmodel.compile(...)
中のメトリックの命名に関連しているということです。 model.compile(....,metrics=['<metric name>'])
内で精度指標に名前を付ける方法と一貫している必要があります。履歴コールバックオブジェクトは、メトリックで定義されたキーと値のペアを含む辞書を受け取ります。
したがって、メトリックがmetrics=['acc']
の場合、history.history['acc']
を使用して履歴オブジェクト内のメトリックにアクセスできますが、メトリックをmetrics=['accuracy']
として定義する場合は、history.history['accuracy']
に変更してKey Errorを回避するための値。お役に立てば幸いです。
N.B.これが メトリックへのリンク であり、Kerasで使用できます。
val_ *データ(val_acc
、val_loss
、...)、最初に検証を設定する必要があります。
最初の方法(あなたが与えるものから検証します):
model.fit(validation_data=(X_test, Y_test))
2番目の方法(トレーニングデータの一部から検証します):
model.fit(validation_split=0.5)
Kerasの古いバージョン(例2.2.5)をTensorflow 2.0と互換性のある2.3.0(またはそれ以降)にアップグレードすると、そのようなエラー(eg KeyError: 'acc')。 accとval_accの両方は、それぞれaccuracyとval_accuracyに名前が変更されました。スクリプトで名前を変更すると、問題が解決します。
このエラーは、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
_の辞書キーは作成されませんでした。