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

时间:2017-05-23 09:28:09

标签: python tensorflow keras neural-network deep-learning

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

  • #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)

(部分)日志:

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    

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

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

我知道在每批中,培训样本中有一个正向传递和一个向后传递。因此,在每个纪元中,所有训练样本都有一个向前传递和一个向后传递

此外,来自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 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:2)

时代结束时的准确度是整个数据集的准确度。每批次之后的准确性是当时用于训练的所有批次的准确性。可能是您的第一批预测非常好并且以下批次的准确度较低。在这种情况下,与第一批产品的准确性相比,整个数据集的准确度会很低。