web-dev-qa-db-ja.com

どのKerasモデルが優れているかを知る方法は?

2つのKerasモデルを比較してどちらが優れているかを比較するために使用する出力の精度がわかりません。

「トレーニングデータからの」「acc」を使用しますか、「検証データからの」「acc」を使用しますか?

エポックごとに異なるaccsとval accsがあります。モデル全体のaccまたはval accを知るにはどうすればよいですか?すべてのエポックaccsまたはval accsを平均して、モデル全体のaccまたはval accを見つけますか?

モデル1出力

Train on 970 samples, validate on 243 samples
Epoch 1/20
0s - loss: 0.1708 - acc: 0.7990 - val_loss: 0.2143 - val_acc: 0.7325
Epoch 2/20
0s - loss: 0.1633 - acc: 0.8021 - val_loss: 0.2295 - val_acc: 0.7325
Epoch 3/20
0s - loss: 0.1657 - acc: 0.7938 - val_loss: 0.2243 - val_acc: 0.7737
Epoch 4/20
0s - loss: 0.1847 - acc: 0.7969 - val_loss: 0.2253 - val_acc: 0.7490
Epoch 5/20
0s - loss: 0.1771 - acc: 0.8062 - val_loss: 0.2402 - val_acc: 0.7407
Epoch 6/20
0s - loss: 0.1789 - acc: 0.8021 - val_loss: 0.2431 - val_acc: 0.7407
Epoch 7/20
0s - loss: 0.1789 - acc: 0.8031 - val_loss: 0.2227 - val_acc: 0.7778
Epoch 8/20
0s - loss: 0.1810 - acc: 0.8010 - val_loss: 0.2438 - val_acc: 0.7449
Epoch 9/20
0s - loss: 0.1711 - acc: 0.8134 - val_loss: 0.2365 - val_acc: 0.7490
Epoch 10/20
0s - loss: 0.1852 - acc: 0.7959 - val_loss: 0.2423 - val_acc: 0.7449
Epoch 11/20
0s - loss: 0.1889 - acc: 0.7866 - val_loss: 0.2523 - val_acc: 0.7366
Epoch 12/20
0s - loss: 0.1838 - acc: 0.8021 - val_loss: 0.2563 - val_acc: 0.7407
Epoch 13/20
0s - loss: 0.1835 - acc: 0.8041 - val_loss: 0.2560 - val_acc: 0.7325
Epoch 14/20
0s - loss: 0.1868 - acc: 0.8031 - val_loss: 0.2573 - val_acc: 0.7407
Epoch 15/20
0s - loss: 0.1829 - acc: 0.8072 - val_loss: 0.2581 - val_acc: 0.7407
Epoch 16/20
0s - loss: 0.1878 - acc: 0.8062 - val_loss: 0.2589 - val_acc: 0.7407
Epoch 17/20
0s - loss: 0.1833 - acc: 0.8072 - val_loss: 0.2613 - val_acc: 0.7366
Epoch 18/20
0s - loss: 0.1837 - acc: 0.8113 - val_loss: 0.2605 - val_acc: 0.7325
Epoch 19/20
0s - loss: 0.1906 - acc: 0.8010 - val_loss: 0.2555 - val_acc: 0.7407
Epoch 20/20
0s - loss: 0.1884 - acc: 0.8062 - val_loss: 0.2542 - val_acc: 0.7449

モデル2出力

Train on 970 samples, validate on 243 samples
Epoch 1/20
0s - loss: 0.1735 - acc: 0.7876 - val_loss: 0.2386 - val_acc: 0.6667
Epoch 2/20
0s - loss: 0.1733 - acc: 0.7825 - val_loss: 0.1894 - val_acc: 0.7449
Epoch 3/20
0s - loss: 0.1781 - acc: 0.7856 - val_loss: 0.2028 - val_acc: 0.7407
Epoch 4/20
0s - loss: 0.1717 - acc: 0.8021 - val_loss: 0.2545 - val_acc: 0.7119
Epoch 5/20
0s - loss: 0.1757 - acc: 0.8052 - val_loss: 0.2252 - val_acc: 0.7202
Epoch 6/20
0s - loss: 0.1776 - acc: 0.8093 - val_loss: 0.2449 - val_acc: 0.7490
Epoch 7/20
0s - loss: 0.1833 - acc: 0.7897 - val_loss: 0.2272 - val_acc: 0.7572
Epoch 8/20
0s - loss: 0.1827 - acc: 0.7928 - val_loss: 0.2376 - val_acc: 0.7531
Epoch 9/20
0s - loss: 0.1795 - acc: 0.8062 - val_loss: 0.2445 - val_acc: 0.7490
Epoch 10/20
0s - loss: 0.1746 - acc: 0.8103 - val_loss: 0.2491 - val_acc: 0.7449
Epoch 11/20
0s - loss: 0.1831 - acc: 0.8082 - val_loss: 0.2477 - val_acc: 0.7449
Epoch 12/20
0s - loss: 0.1831 - acc: 0.8113 - val_loss: 0.2496 - val_acc: 0.7490
Epoch 13/20
0s - loss: 0.1920 - acc: 0.8000 - val_loss: 0.2459 - val_acc: 0.7449
Epoch 14/20
0s - loss: 0.1945 - acc: 0.7928 - val_loss: 0.2446 - val_acc: 0.7490
Epoch 15/20
0s - loss: 0.1852 - acc: 0.7990 - val_loss: 0.2459 - val_acc: 0.7449
Epoch 16/20
0s - loss: 0.1800 - acc: 0.8062 - val_loss: 0.2495 - val_acc: 0.7449
Epoch 17/20
0s - loss: 0.1891 - acc: 0.8000 - val_loss: 0.2469 - val_acc: 0.7449
Epoch 18/20
0s - loss: 0.1891 - acc: 0.8041 - val_loss: 0.2467 - val_acc: 0.7531
Epoch 19/20
0s - loss: 0.1853 - acc: 0.8072 - val_loss: 0.2511 - val_acc: 0.7449
Epoch 20/20
0s - loss: 0.1905 - acc: 0.8062 - val_loss: 0.2460 - val_acc: 0.7531
41
pr338

「トレーニングデータからの」「acc」を使用しますか、「検証データからの」「acc」を使用しますか?

モデルが新しいデータに一般化する能力を推定したい場合(おそらくあなたがしたいことです)、検証スプリットにはトレーニング中にモデルが決して見ないデータのみが含まれるため、検証の精度を確認しますそのため、ただ暗記することはできません。

検証データの精度( "val_acc")が悪化している間、トレーニングデータの精度( "acc")が改善し続ける場合、おそらく オーバーフィット の状況にあります。つまり、モデルは基本的にデータを記憶し始めます。

エポックごとに異なるaccsとval accsがあります。モデル全体のaccまたはval accを知るにはどうすればよいですか?すべてのエポックaccsまたはval accsを平均して、モデル全体のaccまたはval accを見つけますか?

各エポックは、すべてのデータに対して実行されるトレーニングです。その実行中、モデルのパラメーターは損失関数に従って調整されます。結果は、新しいデータに一般化する特定の機能を持つパラメーターのセットです。その能力は、検証の精度に反映されます。すべてのエポックを独自のモデルと考えてください。別のエポック用にトレーニングされると、良くも悪くもなります。良くなったか悪くなったかは、検証精度の変化によって判断されます(より良い=検証精度が向上しました)。したがって、検証の精度が最も高いエポックのモデルを選択してください。異なるエポックの精度を平均化しないでください。これはあまり意味がありません。 KerasコールバックModelCheckpointを使用して、最高の検証精度でモデルを自動的に保存できます( callbacks documentation を参照)。

モデル1の最高精度は0.7737およびモデル2の最高のものは0.7572。したがって、モデル1(エポック3)をより適切に表示する必要があります。 0.7737は単なるランダムな外れ値でした。

60
aleju

Val_lossの減少またはval_accの増加をキーとする必要がありますが、最終的にはそれほど重要ではありません。違いはランダム/丸め誤差の範囲内です。

実際には、過適合によりトレーニングの損失が大幅に減少する可能性があるため、検証の損失を確認する必要があります。

あなたの場合、あなたはあなたのトレーニング損失が減っていないことを見ることができます-つまり、あなたは各エポック後に何も学んでいないことを意味します。このモデルには、些細な線形のような近似値またはカットオフ値は別として、学ぶべきことは何もないように見えます。

また、何も学習しない場合、または些細な線形のことを学習する場合は、トレーニングと検証で同様のパフォーマンスを発揮する必要があります(些細な学習は常に一般化できます)。 validation_split機能を使用する前に、おそらくデータをシャッフルする必要があります。

5
Erik Aronesty