我正在尝试使用encog库作为强化学习问题的函数逼近器。更具体地说,我正在尝试启动和运行一个多层感知器(BasicNetwork)。由于我的代理将根据我选择的RL算法探索世界,我无法预先构建任何BasicNeuralDataSet,如XOR示例中所示。可能,我需要使用pause()和resume()函数,但由于我找不到关于这些函数的任何文档或示例,我对如何使用这些功能感到有些迷茫(如果它们在我使用的版本中有效的话。我在阅读第二个链接中问题的答案后不太确定)。
我使用的是Java和encog-core-2.5.3 jar。我当前的方法如下所示:
BasicNetwork network = new BasicNetwork();network.addLayer(new BasicLayer(null, true,2));network.addLayer(new BasicLayer(new ActivationTANH(), true,4));network.addLayer(new BasicLayer(new ActivationTANH(), true,1));network.getStructure().finalizeStructure();network.reset();TrainingContinuation cont = null;double error = 0;do { int rnd = random.nextInt(trainInputs.length); NeuralDataSet trainingSet = new BasicNeuralDataSet( new double[][] { trainInputs[rnd] }, new double[][] { trainOutputs[rnd] }); Backpropagation train = new Backpropagation(network, trainingSet); // 训练神经网络 if (cont != null) { train.resume(cont); } train.iteration(); cont = train.pause(); error = train.getError();} while (error > 0.01);
这显然是一个最小的示例,我只是从一个玩具样本(XOR)中随机抽取数据点。结果是MLP没有收敛。日志显示完全随机的错误,所以我假设训练器在某种程度上被重置了,我的pause/resume方法没有正确实现。
附注:由于我不限于使用Encoq,可以使用任何框架,因此我也很感激能满足我需求的示例代码。到目前为止,我尝试过Weka和Neuroph,但两者似乎都缺乏真正的在线学习功能,无法在有新样本可用时触发训练(还必须能够在任何时间对样本进行分类)。
回答:
抱歉回复慢了。基本上,听起来你是在问关于在线训练的问题。也就是说,你只提供一个案例,神经网络的权重会立即更新。这样就不需要创建整个训练集,你只需按需训练。不幸的是,Encog在这方面支持得不好。这已经成为一个常见问题,我计划在下一个版本中添加这一功能。
目前,唯一可行的方法是创建一个只包含一个项目的训练集,然后进行一次迭代的训练。
编辑自Encog 3.2起,已添加在线训练功能。请参阅此常见问题解答以获取更多信息。