首页 > 解决方案 > 如何在 Encog 中使用带有 SGD 的迭代方法?

问题描述

我正在使用带有 Adam 更新的随机梯度下降来优化 Encog (Java) 中的简单前馈神经网络。随机梯度下降类提供了一种iteration(count)方法来执行所需的迭代次数。但是,文档没有明确说明迭代是代表一个时期(即在遍历所有训练数据点后进行权重更新)还是仅基于单个批次的权重更新。

此外,通过调用 method getIteration(),结果表明iteration(count)在 while 循环的每个步骤中执行的迭代次数是所需迭代次数的两倍。通过运行以下代码可以重现该错误:

// Define network structure
BasicNetwork network = EncogUtility.
    simpleFeedForward(inputSize, numL1Neurons, numL2Neurons, outputSize, true);
network.reset();

// Stochastic Gradient Descent with Adam
final StochasticGradientDescent train = new StochasticGradientDescent(network, trainingSet);
System.out.println("Update rule: " + train.getUpdateRule().toString());
System.out.println("Batch size: " + train.getBatchSize());

// Count the number of iterations per epoch
int iterationsPerEpoch = (int) Math.ceil(trainingSet.size()/ (double) train.getBatchSize());
System.out.println("Iterations per epoch: " + iterationsPerEpoch);

// Training
int epoch = 0;
StringBuilder line = new StringBuilder();
while (!train.isTrainingDone()) {
   train.iteration(iterationsPerEpoch);
   epoch++;
   line.setLength(0);
   line.append("Epoch #");
   line.append(epoch);
   line.append(", Iteration #");
   line.append(train.getIteration());
   line.append(", Training Error: ");
   line.append(network.calculateError(trainingSet));
   line.append(", Validation Error: ");
   line.append(network.calculateError(validationSet));
   System.out.println(line.toString());
}
train.finishTraining();

为什么getIteration()返回两倍于中指定的迭代次数iteration(count)?在 while 循环的每次迭代中运行一个 epoch 的最佳方法是什么?

标签: javaencog

解决方案


推荐阅读