2017-05-23 39 views
2

ニューラルネットワークをバッチKeras 2.0Pythonのパッケージで訓練しています。以下 は、データとトレーニングパラメータに関するいくつかの情報は次のとおりです。電車の中でニューラルネットワークでは、各エポック後の精度向上は、各バッチ後の精度向上よりも優れています。どうして?

  • #samples:414934
  • #特徴:590093
  • #classes:2(進分類問題)
  • バッチサイズ: 1024
  • #batches = 406(1024分の414934 = 405.2)以下

は以下のコードのいくつかのログである:

for i in range(epochs): 
    print("train_model:: starting epoch {0}/{1}".format(i + 1, epochs)) 
    model.fit_generator(generator=batch_generator(data_train, target_train, batch_size), 
         steps_per_epoch=num_of_batches, 
         epochs=1, 
         verbose=1) 

(部分)ログ:

train_model:: starting epoch 1/3                
Epoch 1/1                     
    1/406 [..............................] - ETA: 11726s - loss: 0.7993 - acc: 0.5996   
    2/406 [..............................] - ETA: 11237s - loss: 0.7260 - acc: 0.6587   
    3/406 [..............................] - ETA: 14136s - loss: 0.6619 - acc: 0.7279   
404/406 [============================>.] - ETA: 53s - loss: 0.3542 - acc: 0.8917    
405/406 [============================>.] - ETA: 26s - loss: 0.3541 - acc: 0.8917    
406/406 [==============================] - 10798s - loss: 0.3539 - acc: 0.8918    
train_model:: starting epoch 2/3                
Epoch 1/1                     
    1/406 [..............................] - ETA: 15158s - loss: 0.2152 - acc: 0.9424   
    2/406 [..............................] - ETA: 14774s - loss: 0.2109 - acc: 0.9419   
    3/406 [..............................] - ETA: 16132s - loss: 0.2097 - acc: 0.9408   
404/406 [============================>.] - ETA: 64s - loss: 0.2225 - acc: 0.9329    
405/406 [============================>.] - ETA: 32s - loss: 0.2225 - acc: 0.9329    
406/406 [==============================] - 13127s - loss: 0.2225 - acc: 0.9329    
train_model:: starting epoch 3/3                
Epoch 1/1                     
    1/406 [..............................] - ETA: 22631s - loss: 0.1145 - acc: 0.9756   
    2/406 [..............................] - ETA: 24469s - loss: 0.1220 - acc: 0.9688   
    3/406 [..............................] - ETA: 23475s - loss: 0.1202 - acc: 0.9691   
404/406 [============================>.] - ETA: 60s - loss: 0.1006 - acc: 0.9745    
405/406 [============================>.] - ETA: 31s - loss: 0.1006 - acc: 0.9745    
406/406 [==============================] - 11147s - loss: 0.1006 - acc: 0.9745  

私の質問は:そのような精度を向上させ、各エポックの後に何が起こりますか?例えば、第1のエポックの終わりの精度は0.8918であるが、第2のエポックの精度は0.9424の精度が観察される。同様に、第2のエポックの終わりの精度は0.9329であるが、第3のエポックは0.9756の精度で始まる。

第2期の開始時に〜0.8918、第3期の開始時に〜0.9329の精度が期待されます。

は私が各バッチで前方1パスとバッチで訓練サンプルの1つの復路があることを知っています。したがって、各期にには、順方向パスが1つ、逆方向パスが1つ、すべてのトレーニングサンプルがあります。 Keras documentationからまた

Epoch: an arbitrary cutoff, generally defined as "one pass over the entire dataset", used to separate training into distinct phases, which is useful for logging and periodic evaluation.

なぜ各エポック内の精度向上がエポックXの端部とエポックX + 1の開始の間の精度の向上よりも小さいですか?

答えて

2

これは、モデルやデータセットとは関係ありません。この「ジャンプ」の理由は、Kerasでメトリックを計算して表示する方法にあります。

Kerasはバッチ処理後のバッチを処理するので、精度が保存され、最新の処理バッチの精度ではなく、現在のエポックのすべてのバッチの平均です。また、モデルが訓練されている間、連続バッチに対する精度は向上する傾向があります。

ここで、最初のエポックでは、50個のバッチがあり、これらの50個のバッチでネットワークが0%から90%になったとします。その後、紀元前にKerasの精度が表示されます。 (0 + 0.1 + 0.5 + ... + 90)/50%、明らかに90%未満です。しかし、実際の精度が90%であるため、2番目のエポックの最初のバッチは90%と表示され、品質の急激な上昇を感じます。明らかに、同じことがlossまたは他のすべての指標に適用されます。

精度、損失、または他の測定基準をより現実的かつ信頼できる方法で計算したい場合は、model.fit[_generator]validation_dataパラメータを使用して、トレーニングには使用しない検証データを提供することをお勧めします。さまざまな時点で平均することなく、各エポックの終わりにネットワークを評価するためにのみ使用されます。

+0

ありがとう!今それは理にかなっています。 – Mockingbird

2

エポックの最後の精度は、完全なデータセットの精度です。各バッチ後の精度は、その時点でトレーニングに使用されているすべてのバッチに対する精度です。あなたの最初のバッチが非常によく予測され、以下のバッチの精度が低い場合があります。その場合、完全なデータセットの精度は、最初のバッチの精度と比較して低くなります。

+0

ウィルマーありがとうございます。各エポックの終わりの精度はすべてのトレーニングセットで計算されるため、最初のバッチの精度よりも低い可能性があります。ただし、各エポック(エポック1:0.5996-0.8918;エポック2:0.9424-0.9329;エポック3:0.9756-0.9745)の精度範囲を参照しても、エポック間の改善はエポック内の改善よりも大きくなります(ただし、もちろん最初の時代の最初のバッチ)。何故ですか? – Mockingbird

+0

私はそれが理由だとは思わない。少なくとも十分に準備されたデータセットでは、バッチごとにモデルのパフォーマンスが異なることはありませんが、バッチごとに減少することはほとんどありません。 – Akiiino

+0

バッチはトレーニングデータの一部です。これは、モデルによって合計データセットの近似値として認識されます。各バッチは1回だけ更新されます。各エポックのモデルは、データセットのサイズ/バッチサイズと同じ回数だけ更新されます。 @Akiiinoおそらくそうではないかもしれませんが、この数のエポックでは確かに可能です。 –

関連する問題