我正在使用Keras 2.0
Python
包来训练批次的神经网络。
以下是有关数据和培训参数的一些信息:
以下是以下代码的一些日志:
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开始之间的准确度提高?
答案 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)
时代结束时的准确度是整个数据集的准确度。每批次之后的准确性是当时用于训练的所有批次的准确性。可能是您的第一批预测非常好并且以下批次的准确度较低。在这种情况下,与第一批产品的准确性相比,整个数据集的准确度会很低。