2017-12-31 174 views
1

私はKerasモデルに合っていて、履歴オブジェクトと評価関数 の両方を使用して、モデルの性能を確認しようとしています。Keras model.fitとmodel.evaluateの精度が異なるのはなぜですか?

optimizer = Adam (lr=learning_rate) 
model.compile(loss='categorical_crossentropy', 
       optimizer=optimizer, 
       metrics=['accuracy') 
for epoch in range (start_epochs, start_epochs + epochs): 
    history = model.fit(X_train, y_train, verbose=0, epochs=1, 
       batch_size=batch_size, 
       validation_data=(X_val, y_val)) 

    print (history.history) 
    score = model.evaluate(X_train, y_train, verbose=0) 
    print ('Training accuracy', model.metrics_names, score) 
    score = model.evaluate(X_val, y_val, verbose=0) 
    print ('Validation accuracy', model.metrics_names, score) 

驚くように、トレーニングセットの精度と損失の結果は、履歴と評価の間で異なります。バリデーションセットの結果が等しいので、私の側からはいくつかの失敗があるようですが、何も見つかりません。私は以下の最初の4つのエポックの出力を与えました。メトリック「mse」についても同じ結果が得られました。トレーニングセットは異なり、テストセットは同じです。誰も考えられない?驚くことにするものは何もありません

{'val_loss': [13.354823187591416], 'loss': [2.7036468725265874], 'val_acc': [0.11738484422572477], 'acc': [0.21768202061048531]} 
Training accuracy ['loss', 'acc'] [13.265716915499048, 0.1270430906536911] 
Validation accuracy ['loss', 'acc'] [13.354821096026349, 0.11738484398216939] 

{'val_loss': [11.733116257598105], 'loss': [1.8158155931229045], 'val_acc': [0.26745913783295899], 'acc': [0.34522040671733062]} 
Training accuracy ['loss', 'acc'] [11.772184015560292, 0.26721149086656992] 
Validation accuracy ['loss', 'acc'] [11.733116155570542, 0.26745913818722139] 

{'val_loss': [7.1503656643815061], 'loss': [1.5667824202566349], 'val_acc': [0.26597325444044367], 'acc': [0.44378405117114739]} 
Training accuracy ['loss', 'acc'] [7.0615554528994506, 0.26250619121327617] 
Validation accuracy ['loss', 'acc'] [7.1503659895943672, 0.26597325408618128] 

{'val_loss': [4.2865109046890693], 'loss': [1.4087548087645783], 'val_acc': [0.13893016366866509], 'acc': [0.49232293093422957]} 
Training accuracy ['loss', 'acc'] [4.1341019072350802, 0.14338781575775195] 
Validation accuracy ['loss', 'acc'] [4.2865103747125541, 0.13893016344725112] 

答えて

2

重みは、各バッチに変化しているとして、トレーニングセットのメトリックは、トレーニング中にすべてのバッチの上にちょうど平均です。

model.evaluateを使用すると、与えられたデータ全体のモデルの重みが固定され、損失/精度が計算されます。トレーニングセットで損失/精度を求めたい場合は、model.evaluateを使用し、それに。履歴オブジェクトは、トレーニングセットに真の損失/正確さを持たない。

+0

ああ、その現象を説明します。あなたの説明に+1。 – Arnold

関連する問題