web-dev-qa-db-ja.com

一括あたりではなく、エポックごとに損失を受けるにはどうすればよいですか。

私の理解において、エポックはデータセット全体を越えて任意に繰り返されることが多いので、それは次に部分的に処理され、いわゆるバッチで処理されます。各_train_on_batch_損失が計算された後、重みが更新され、次のバッチがより良い結果が得られます。これらの損失は、私のNNSの品質と学習状態の指標です。

いくつかのソースでは、損失はエポックごとに計算(そして印刷)されます。したがって、私はこの権利をやっているかどうかわからない。

現時点では、私の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
_

これらの損失は各バッチごとです。エポックのためにそれらを手に入れるのですか?脇に:私はエポックのために損失を必要としますか?

5
Sebastian

私は@Today oneseを少し展開します。エポックの損失を報告する方法、およびそれを使用してトレーニングを停止すべきかを判断する方法をどのように報告するかに匹敵するバランスがあります。

  • 最新のバッチの損失を見ているだけでは、それはあなたのモデルの喪失が起こったかもしれないので、あなたのモデルが問題を抱えていたすべてのサンプル、または成功するために些細なサンプルのすべてのサンプルを保存したのでしょうか。 。
  • あなたがエポックのすべてのバッチの平均損失を見れば、あなたが示されたように、モデルは(うまくいけば)エポックの上で改善されているので、最初のバッチのパフォーマンスは意味的にはないので、ゆがみのある反応を得ることができるでしょう。後のバッチのパフォーマンスと比較して。

あなたのエポックの損失を正確に報告する唯一の方法は、あなたのモデルをトレーニングモードから実行することです、すなわちすべてのモデルパラメータを修正し、データセット全体でモデルを実行します。それはあなたのエポック損失の公平な計算になるでしょう。しかし、一般的には、複雑なモデルやトレーニングデータが多い場合、これを行う時間を無駄にします。

だから、私は、平均損失を報告することによって、これらの要因を最も一般的であると思います[〜#〜] n [〜#〜]ミニバッチ、ここで、[〜#〜] n [〜#〜]は、個々のバッチのノイズを滑らかにするのに十分な大きさであるが、モデル性能が大きくはありません。最初のバッチと最後のバッチの間で同等ではありません。

私はあなたがケーラスにいるのを知っていますが、 ここ この概念を明確に説明し、ここで複製したPytorchの例です。

for Epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (Epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')
 _

損失を累積することができます[〜#〜] n [〜#〜]= 2000バッチで、それらの2000バッチに対する平均損失を報告する、その後、走行損失をゼロにして続けます。

1
adamconkey