我如何在每个时期而不是每个批次中获得损失?

Seb*_*ian 7 python machine-learning keras generative-adversarial-network

在我的理解中,epoch 是在整个数据集上任意频繁地重复运行,然后分部分处理,即所谓的批处理。每次train_on_batch计算损失后,权重都会更新,下一批将获得更好的结果。这些损失是我对神经网络质量和学习状态的指标。

在几个来源中,每个时期都会计算(并打印)损失。因此,我不确定我这样做是否正确。

目前我的 GAN 看起来像这样:

for epoch:
  for batch:

    fakes = generator.predict_on_batch(batch)

    dlc = discriminator.train_on_batch(batch, ..)
    dlf = discriminator.train_on_batch(fakes, ..)
    dis_loss_total = 0.5 *  np.add(dlc, dlf)

    g_loss = gan.train_on_batch(batch,..)

    # save losses to array to work with later
Run Code Online (Sandbox Code Playgroud)

这些损失是针对每个批次的。我如何在一个时代获得它们?顺便说一句:我需要一个时代的损失,为了什么?

tod*_*day 7

没有直接的方法来计算一个时期的损失。实际上,一个 epoch 的损失通常定义为该 epoch 中批次损失的平均值。因此,您可以在一个 epoch 期间累积损失值,并在最后将其除以该 epoch 中的批次数:

epoch_loss = []
for epoch in range(n_epochs):
    acc_loss = 0.
    for batch in range(n_batches):
        # do the training 
        loss = model.train_on_batch(...)
        acc_loss += loss
    epoch_loss.append(acc_loss / n_batches)
Run Code Online (Sandbox Code Playgroud)

至于另一个问题,epoch loss 的一个用途可能是将其用作停止训练的指标(但是,通常使用验证损失,而不是训练损失)。

  • 只是大声想一下,这种计算每个时期 *training* 损失的方法在实践中并不是很有意义(因此很有用)……毕竟,我们对网络的“当前”状态感兴趣,所以为什么要关心它在一个纪元开始时 K 批次前的表现(其中 K 可能是数百个或更多)? (3认同)