2016-01-10 10 views
28

2つのKerasモデルを比較してどれが良いかを確認するために出力のどの精度が分かりませんか。どのKerasモデルが優れているかを知るには?

「acc」(トレーニングデータから)または「val acc」(検証データから)を使用しますか?

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

モデル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 

答えて

37

は、私が(訓練データから?) "ACC" を使用しています一つまたは「ヴァルACC "(検証データから)?

あなたは(あなたが何をしたいか考えられます)、新しいデータに一般化するモデルの能力を推定したい場合は、検証分割がそのモデルデータのみが含まれているため、あなたは、検証精度を見て訓練中には決して見ることができず、そのために覚えるだけではありません。

検証データの精度(「val_acc」)が悪化してもトレーニングデータの精度(「acc」)が向上し続ける場合は、overfittingの状況にある可能性が高いです。つまり、モデルは基本的にデータを記憶し始めます。

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

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

モデル1の最高精度は0.7737であり、モデル2の最高精度は0.7572です。したがって、モデル1(エポック3)をよりよく見なければなりません。 0.7737はちょうどランダムな外れ値かもしれませんが。

+1

Model Checkpointは、「検証の損失が減少した場合、各エポック後にモデルの重みを保存します」。これは、より高い検証確度と同等であるか?検証の損失は減少するものの、検証の精度はそれほど高くはないものの、ときどき参照する数値を見ると、これはなぜですか? – pr338

+3

あなたのモデルがラベル1を予測する4つの例があるとしましょう。今度は、値0.51の4倍を予測します(それぞれがしきい値0.5を超えているので、予測は精度測定によって正しいと見なされます)。次のエポックでは、値を0.49,0.49,0.49、および0.95に変更します。損失関数の値は(0.51から0.95への大きな変化のために)大幅に改善されますが、3つの値が0.5のしきい値を下回っているため、精度が悪くなります。したがって、ラベル0と見なされます。 – aleju

+0

@alejuちょっと不思議、エポックの数を増やしてモデルをより良くしますか?私は、エポックの数がモデルの精度にどのように影響するかについて、まだ非常に混乱しています。 – user136266

2

あなたは最終的に、それは問題であまりない、val_lossを低下またはval_accを増やす上のキーにする必要があります。違いは、ランダム/丸め誤差の範囲内です。

実際には、トレーニング損失は、あなたが検証損失を見てみたい理由であるオーバーフィッティングに大幅に低下することができます。

あなたのケースでは、あなたのトレーニングの損失が低下していないことがわかります。つまり、各エポック後には何も学習していません。これは、このモデルでは何もないように見えますが、些細な直線的なフィットやカットオフの値を除いてはそうです。

また、何も学習していないとき、または些細な線形のものを学習するときには、訓練と検証(些細な学習は常に一般化可能)で同様のパフォーマンスが必要です。 validation_split機能を使用する前に、データをシャッフルする必要があります。

関連する問題