【问题标题】:In Neural Networks: accuracy improvement after each epoch is GREATER than accuracy improvement after each batch. Why?在神经网络中:每个 epoch 之后的准确度提升大于每批之后的准确度提升。为什么?
【发布时间】:2017-10-23 04:12:37
【问题描述】:

我正在使用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    

我的问题是:每个 epoch 之后会发生什么以提高准确性?例如,第一个 epoch 结束时的准确度为 0.8918,但在第二个 epoch 开始时,观察到的准确度为 0.9424。同样,第二个epoch结束时的准确度为0.9329,但第三个epoch开始时的准确度为0.9756。

我希望在第二个 epoch 开始时找到 ~0.8918 的准确度,在第三个 epoch 开始时找到 ~0.9329。

我知道在每个批次中有一个前向传递和一个反向传递批次中的训练样本。因此,在每个 epoch 中,所有训练样本都有一个前向传递和一个后向传递。

另外,来自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.

为什么每个 epoch 内的准确率提升小于 epoch X 结束和 epoch X+1 开始之间的准确率提升?

【问题讨论】:

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


    【解决方案1】:

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

    随着 Keras 逐批处理,它会保存每个批次的准确度,它向您显示的不是最新处理的批次的准确度,而是当前时期所有批次的平均值。而且,随着模型的训练,连续批次的准确性往往会提高。

    现在考虑:在第一个 epoch,假设有 50 个批次,在这 50 个批次期间,网络从 0% 变为 90%。然后在时代结束时,Keras 将显示准确度,例如(0 + 0.1 + 0.5 + ... + 90) / 50%,这显然远低于 90%!但是,因为你的实际准确率是 90%,所以第二个 epoch 的第一批会显示 90%,给人一种质量突然“跳跃”的印象。显然,loss 或任何其他指标也是如此。

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

    【讨论】:

    • 谢谢!现在说得通了。
    【解决方案2】:

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

    【讨论】:

    • 谢谢丰益。我知道每个时期结束时的准确度是在所有训练集上计算的,因此可能低于第一批的准确度。但是,即使您参考每个时期的准确度范围(时期 1:0.5996-0.8918;时期 2:0.9424-0.9329;时期 3:0.9756-0.9745),时期之间的改进也大于时期内的改进(不包括当然是第一个时代的第一批)。这是为什么呢?
    • 我不认为这是原因;模型性能不太可能(至少在准备充分的数据集中)在批次之间存在差异,更不用说随着每个批次而降低了。
    • 批次是训练数据的一小部分,模型将其视为总数据集的近似值。每批模型只会更新一次。每个时期,模型的更新次数与您的数据集大小/批量大小一样多。 @Akiiino 这可能不太可能,但是有了这么多的时代,这当然是可能的
    猜你喜欢
    • 2020-03-07
    • 2020-05-01
    • 2018-09-11
    • 1970-01-01
    • 2017-07-05
    • 2021-12-12
    • 2022-07-25
    • 2020-11-02
    • 2016-08-02
    相关资源
    最近更新 更多