java - 如何在 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 的最佳方法是什么?
解决方案
推荐阅读
- python - Python:如何在注意图形结构的同时迭代 MIME 消息树?
- spacy - 如何将现有的拥抱脸变压器模型用于 spacy?
- ios - 如何在自定义浏览器上实现广告拦截器?
- php - PHP ImagefilledArc IMG_ARC_PIE 不完整饼图
- apache-spark - 如何将 DeltaLake 文件从 GCS 包含到 BigQuery
- docker - 使用容器名称作为 DNS 名称的 Docker 容器“错误网关”错误(使用 ip 它可以工作)
- reactjs - 如何使用 TypeScript/RTK 在被拒绝的情况下定义有效负载对象的类型
- django - 如何获取通过另一个模型加入的房间用户列表
- python - 如何使用python在selenium webdriver中找到2秒内显示和隐藏的元素?
- html - 尝试从没有正确“允许”属性的框架中调用 getUserMedia,在 Safari 中