web-dev-qa-db-ja.com

ケラスで学習曲線をプロットするとKeyError: 'val_acc'が発生する

ケラスでトレーニングとテストの学習曲線をプロットしようとしていましたが、次のコードは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()
7
Data Pagla

Keras + Tensorflow 2.0のようですval_accval_accuracyに名前が変更されました

12
driedler

トレインセットの検証分割を有効にする必要がある場合があります。通常、検証はトレインセットの1/3で行われます。コードで、以下のように変更を加えます。

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

できます!

10
thanvaf
_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']
_

キーとエラー

8
user11992433

誰もが言及し忘れている主な点は、これKey Errormodel.compile(...)中のメトリックの命名に関連しているということです。 model.compile(....,metrics=['<metric name>'])内で精度指標に名前を付ける方法と一貫している必要があります。履歴コールバックオブジェクトは、メトリックで定義されたキーと値のペアを含む辞書を受け取ります。

したがって、メトリックがmetrics=['acc']の場合、history.history['acc']を使用して履歴オブジェクト内のメトリックにアクセスできますが、メトリックをmetrics=['accuracy']として定義する場合は、history.history['accuracy']に変更してKey Errorを回避するための値。お役に立てば幸いです。

N.B.これが メトリックへのリンク であり、Kerasで使用できます。

3
sajid

val_ *データ(val_accval_loss、...)、最初に検証を設定する必要があります。

最初の方法(あなたが与えるものから検証します):

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

2番目の方法(トレーニングデータの一部から検証します):

model.fit(validation_split=0.5) 
3
Elior B.Y.

Kerasの古いバージョン(例2.2.5)をTensorflow 2.0と互換性のある2.3.0(またはそれ以降)にアップグレードすると、そのようなエラー(eg KeyError: 'acc')。 accval_accの両方は、それぞれaccuracyval_accuracyに名前が変更されました。スクリプトで名前を変更すると、問題が解決します。

2

このエラーは、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_の辞書キーは作成されませんでした。

0
Tshilidzi Mudau