私の理解において、エポックはデータセット全体を越えて任意に繰り返されることが多いので、それは次に部分的に処理され、いわゆるバッチで処理されます。各_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
_
これらの損失は各バッチごとです。エポックのためにそれらを手に入れるのですか?脇に:私はエポックのために損失を必要としますか?
私は@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バッチに対する平均損失を報告する、その後、走行損失をゼロにして続けます。