我经历了整个文档,并没有找到如何设置RBF网络.我在ConsoleExmpales/Examples/Radial中找到了一些RBF示例,但看起来它不再起作用,因为在Encog中已经更改了一些方法.
到目前为止,我坚持这个:
public static double[][] XORInput = {
new[] {0.0, 0.0},
new[] {1.0, 0.0},
new[] {0.0, 1.0},
new[] {1.0, 1.0}
};
public static double[][] XORIdeal = {
new[] {0.0},
new[] {1.0},
new[] {1.0},
new[] {0.0}
};
int dimension = 8;
int numNeuronsPerDimension = 64;
double volumeNeuronWidth = 2.0 / numNeuronsPerDimension;
bool includeEdgeRBFs = true;
RBFNetwork n = new RBFNetwork(dimension, numNeuronsPerDimension, 1, RBFEnum.Gaussian);
n.SetRBFCentersAndWidthsEqualSpacing(0, 1, RBFEnum.Gaussian, volumeNeuronWidth, includeEdgeRBFs);
//n.RandomizeRBFCentersAndWidths(0, 1, RBFEnum.Gaussian);
INeuralDataSet trainingSet = new BasicNeuralDataSet(XORInput, XORIdeal);
SVDTraining train = new …
Run Code Online (Sandbox Code Playgroud) 我正在制作一个程序,使用encog预测足球比赛的结果.我创建了一个神经网络,使用弹性传播训练方法训练了90个匹配的数据.我已经将比赛结果标记为1表示主场胜利,0表示平局,-1表示客场胜利.
问题在于预测.有时我获得50%的成功率,而其他时间我得到低至33%.这就像使用随机函数.我注意到的是,最接近预测的结果是1(约70%).我已经尝试过改变隐藏层数,训练次数但没有运气,它仍在振荡.如果我做错了什么,任何人都可以帮助我或者让我朝着正确的方向前进.
这是神经网络的代码.我正在从数据库获取训练数据和预测数据.
Predictor(NeuralDataSet trainingData){
trainingSet = trainingData;
network = new BasicNetwork();
network.addLayer(new BasicLayer(16));
network.addLayer(new BasicLayer(3));
network.addLayer(new BasicLayer(1));
network.getStructure().finalizeStructure();
network.reset();
}
Run Code Online (Sandbox Code Playgroud)
训练
public void train(int epoch){
int i =0;
final Train train =new ResilientPropagation(network,trainingSet);
while(i<=epoch){
train.iteration();
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
预测
public void successRate(NeuralDataSet trainingData){
int counter = 0;
int correct = 0;
int home=0;
int away=0;
int draw=0;
for(MLDataPair pair: trainingData ) {
final MLData output = network.compute(pair.getInput());
if(pair.getIdeal().getData(0)==Math.round(output.getData(0)))
correct++;
counter++;
}
System.out.println((double)correct/(double)counter);
}
Run Code Online (Sandbox Code Playgroud)
1.)我将数据提供给神经网络1000.目前正在进行更多/更少的测试,因为事情变得更好.
2,3.)我有16个输入参数.他们包括:主队积分,主场主场胜利,平局,失利,主队总胜场,失利,平局和形式(最近5场比赛得分).相同的数据仅用于客场球队,而不是主队主场胜利,平局,失去球队客场胜利,平局,亏损被使用.我将尝试不同的训练数据.
我正在编写一个将执行图像识别和分析的Android应用程序.我听说神经网络是执行图像识别的更好方法之一,并试图移植CodeProject上的Mike O'Neill在他出色的Win32手写数字识别应用程序中使用的库.然而,我最近被告知Encog和Neuroph这两个用于神经网络/图像识别的杰出Java库.我只需要神经网络就可以工作,我将围绕另一个神经网络库编写自己的图像识别套件.有没有人知道Encog或Neuroph是否可以在Android上运行,最好是Encog?
编辑:我已经用Google搜索过了,我想知道是否有人能够真正证明图书馆在工作.
我决定使用带有反向传播训练的前馈NN来为我的OCR应用程序提供手写文本,输入层将使用32*32(1024)个神经元和至少8-12个输出神经元.
通过同时阅读一些文章我发现Neuroph很容易使用,而Encog在性能方面要好几倍.考虑我的场景中哪些API是最合适的参数.如果你能评论我已经采取的输入节点的数量,我是否感谢,是否它的值太大(虽然它超出了主题)
我需要规范化CSV文件.我跟着杰夫希顿写的这篇文章.这是(部分)我的代码:
File sourceFile = new File("Book1.csv");
File targetFile = new File("Book1_norm.csv");
EncogAnalyst analyst = new EncogAnalyst();
AnalystWizard wizard = new AnalystWizard(analyst);
wizard.wizard(sourceFile, true, AnalystFileFormat.DECPNT_COMMA);
final AnalystNormalizeCSV norm = new AnalystNormalizeCSV();
norm.analyze(sourceFile, false, CSVFormat.ENGLISH, analyst);
norm.setProduceOutputHeaders(false);
norm.normalize(targetFile);
Run Code Online (Sandbox Code Playgroud)
我的代码和文章之一的唯一区别是这一行:
norm.setOutputFormat(CSVFormat.ENGLISH);
Run Code Online (Sandbox Code Playgroud)
我试图使用它,但似乎在Encog 3.1.0中,该方法不存在.我得到的错误就是这个(看起来问题出在线上norm.normalize(targetFile)
:
Exception in thread "main" org.encog.app.analyst.AnalystError: Can't find column: 11700
at org.encog.app.analyst.util.CSVHeaders.find(CSVHeaders.java:187)
at org.encog.app.analyst.csv.normalize.AnalystNormalizeCSV.extractFields(AnalystNormalizeCSV.java:77)
at org.encog.app.analyst.csv.normalize.AnalystNormalizeCSV.normalize(AnalystNormalizeCSV.java:192)
at IEinSoftware.main(IEinSoftware.java:55)
Run Code Online (Sandbox Code Playgroud) 有人可以告诉我如何在Encog 3.1中使用多类SVM分类?
我已经使用他们的神经网络取得了一些成功,但无法弄清楚如何设置多类SVM.
文档有这样的说法:
"这是一个由一个或多个支持向量机(SVM)支持的网络.它的设计功能与Encog神经网络非常相似,并且在很大程度上可与Encog神经网络互换.分类用于你希望SVM将输入数据分组到一个或多个类中.支持向量机通常只有一个输出.神经网络可以有多个输出神经元.为了解决这个问题,如果有多个SVM,这个类将创建多个SVM输出指定"
但是我看不出如何指定多个输出,实际上输出属性只返回1:
/// <value>For a SVM, the output count is always one.</value>
public int OutputCount
{
get { return 1; }
}
Run Code Online (Sandbox Code Playgroud)
Java或c#中的答案非常感谢
编辑仍然无法解决这个问题.真的很享受使用Encog,但支持论坛只有Jeff Heaton(项目的作者)在他有机会时自己回答,所以即时联系项目代码并添加赏金,希望有人能看到我明显缺少的东西.
该项目:http: //heatonresearch.com/
Google代码上的SupportVectorMachine类:https: //code.google.com/p/encog-cs/source/browse/trunk/encog-core/encog-core-cs/ML/SVM/SupportVectorMachine.cs
NeuralDataSet
我在行动中看到的 对象并不是XOR,只是两个小数据阵列......我无法从文档中找到任何内容MLDataSet
.
似乎一切都必须立即加载.但是,我想循环训练数据,直到我达到EOF,然后将其计为1个纪元.但是,我所看到的所有数据必须从头开始加载到1个2D数组中.我怎么能绕过这个?
我已经读过这个问题了,答案并没有真正帮助我.除此之外,我还没有在这里找到类似的问题.
java artificial-intelligence machine-learning neural-network encog
是否有关于如何使用Encog Framework的详细文档?我知道在现有的用户指南UserGuide,并在C#示例encog的github仓库
但是我专注于使用NEAT网络,并且只有XOR示例可用.到目前为止,代码如下所示:
Dim inputNeurons As Integer = 6, outputNeurons As Integer = 2
Dim trainedNetwork As NEATNetwork
Dim network As New NEATPopulation(inputNeurons, outputNeurons, 5000)
network.Reset()
network.InitialConnectionDensity = 100.0
Dim speciation As New OriginalNEATSpeciation()
speciation.CompatibilityThreshold = 1
Dim trainer As TrainEA
trainer = NEATUtil.ConstructNEATTrainer(network, New networkScore())
trainer.Speciation = speciation
epoch = 1
iterationLimit = 30
i = 1
While i <= iterationLimit
trainer.Iteration()
Console.WriteLine("Iteration #" & i & "/" & iterationLimit & " #" + epoch.ToString + …
Run Code Online (Sandbox Code Playgroud) machine-learning neural-network genetic-algorithm encog es-hyperneat
我正在开发一个时间序列预测系统.我买了Book of Encog3 for Java,但我需要知道热,提交一个包含3列的CSV文件并尝试预测第二列.CSV定义如下:
Date
,DeviceConsumption
,TotalPower
我需要将该文件加载到加载器中,然后指定我想要预测的列(即DeviceConsumption
).第三列用于提供更多信息并创建模式.
在示例中(如太阳黑子)我看到了
TemporalMLDataSet result = new TemporalMLDataSet(windowSize,1);
TemporalDataDescription desc = new TemporalDataDescription(new ActivationSIN(),Type.RAW, false, true);
result.addDescription(desc);
Run Code Online (Sandbox Code Playgroud)
但是我在哪里可以定义我想要预测的列?
谢谢.
编辑2 我做了一些改进:
对不起,我还是不明白.我能够像你说的那样创建2个TemporalDataDescription.但是我要将两者都添加到相同的TemporalMLDataSet中吗?
TemporalMLDataSet result = new TemporalMLDataSet(WINDOW_SIZE,1);
TemporalDataDescription desc = new TemporalDataDescription(
TemporalDataDescription.Type.RAW,true,true);
result.addDescription(desc);
TemporalDataDescription desc2 = new TemporalDataDescription(
TemporalDataDescription.Type.RAW,false,true);
result.addDescription(desc2);
for(int year = TRAIN_START;year<TRAIN_END;year++)
{
TemporalPoint point = new TemporalPoint(2);
point.setSequence(year);
point.setData(0, this.deviceConsumption[year]);
point.setData(1, this.TotalPower[year]);
result.getPoints().add(point);
}
result.generate();
Run Code Online (Sandbox Code Playgroud)
这是对的吗?
EDIT3以前的代码是正确的!
我一直在使用.NET框架来训练神经网络,我的数据集非常庞大,输入数量很多.
我决定切换到Encog,因为我使用的旧框架存在一些问题,而且因为Encog看起来更丰富并且提供了额外的功能.
我的问题是Encog将所有训练数据一次加载到2D数组中,这不适合我,因为我有一个非常大的数据集.我已经尝试过解决这个问题,并检查了其他问题(例如这个问题,但找不到一个好的答案).
我尝试使用SQLNeuralDataSet和其他支持流操作的实现,但它们似乎最终都将数据加载到内存中(使用MemoryDataLoader),这并不能解决我的问题.
有没有办法可以一次加载(和训练)我的网络一个项目?或者这个选项在Encog中不可用?
谢谢
编辑
我最终复制了源代码并根据我的需要进行了修改.基本上,这一切都归结于Process(IMLDataPair pair)
在GradientWorker
其中,根据文档:
处理一个训练集元素.
.net artificial-intelligence machine-learning neural-network encog
encog ×10
java ×5
c# ×2
.net ×1
android ×1
csv ×1
es-hyperneat ×1
radial ×1
svm ×1
time-series ×1