在神经网络中:每个时期后的准确度提高比每批次后的准确度提高更大.为什么?

Moc*_*ird 5 python neural-network deep-learning keras tensorflow

我在训练神经网络批次Keras 2.0Python.以下是有关数据和培训参数的一些信息:

  • #samples in train:414934
  • #features:590093
  • #classes:2(二进制分类问题)
  • 批量大小:1024
  • #batches = 406(414934/1024 = 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)
Run Code Online (Sandbox Code Playgroud)

(部分)日志:

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    
Run Code Online (Sandbox Code Playgroud)

我的问题是:在每个时代之后会发生什么改善这样的准确性?例如,第一个时期结束时的准确度是0.8918,但是在第二个时期的开始时观察到0.9424的准确度.同样,第二纪元末期的准确度为0.9329,但第三纪元的精确度为0.9756.

我期望在第二纪元开始时找到~0.8918的准确度,在第三纪元开始时找到~0.9329.

我知道在每批中,批次中有一个正向通道和一个向后通过的训练样本.因此,在每个时期中,存在所有训练样本的一个前向传递和一个后向传递.

另外,来自Keras文档:

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开始之间的准确度提高?

Aki*_*ino 8

这与您的模型或数据集无关; 这种"跳跃"的原因在于如何在Keras中计算和显示指标.

由于Keras一批又一批地处理,它可以节省每一个的准确性,它显示给您的不是最新处理批次的准确性,而是当前时期所有批次的平均值.而且,随着模型的培养,连续批次的准确性趋于提高.

现在考虑:在第一个时代,比方说,有50个批次,在这50个批次中,网络从0%到90%.然后在时代结束时,Keras将显示精确度,例如(0 + 0.1 + 0.5 + ... + 90) / 50%,这显然远低于90%!但是,因为你的实际精确度是90%,第二个时代的第一批将显示90%,给人的印象是质量突然"跳跃".显然,这同样适用于loss任何其他指标.

现在,如果您想要更准确,可靠地计算准确性,丢失或您可能发现自己使用的任何其他指标,我建议使用validation_data参数model.fit[_generator]来提供验证数据,这些数据不会用于培训,但仅用于在每个时代结束时评估网络,而不是在各个时间点上进行平均.