我正在使用Encog库,通过遵循Jeff Heaton先生提供的基本示例来解决模式识别问题。我有图案
1 3 5 4 3 5 4 3 1
这是我的理想模式,输出为1(这意味着它100%相同)现在我想输入另一个模式,看看它与理想模式有多相似。
此代码用于创建网络
BasicNetwork network = new BasicNetwork();
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, NumberOfInputNeurons));
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 20));
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 15));
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 1));
network.Structure.FinalizeStructure();
network.Reset();
INeuralDataSet trainingSet = new BasicNeuralDataSet(XOR_INPUT, XOR_IDEAL);
然后,我训练网络
do
{
train.Iteration();
Console.WriteLine("Epoch #" + epoch + " Error:" + train.Error);
epoch++;
} while ((epoch <= 20000) && (train.Error > 0.001));
最后,我打印结果:
foreach (INeuralDataPair pair in trainingSet)
{
INeuralData output = network.Compute(pair.Input);
Console.WriteLine(pair.Input[0] + "-" + pair.Input[1] + "-" + pair.Input[2] + ....
+ ": actual = " + output[0] + " ideal=" + pair.Ideal[0]) ;
}
再次回到我的问题:
如何输入另一个模式并查看它是否与我的模式相似
欢迎任何可能让我找到解决方案的想法。感谢
我不确定我是否完全遵循了这一点。你有更多的图案吗?或者你的训练集只是一种模式,而你只是想看看其他模式与之有多相似?神经网络并不能真正比较模式之间的相似程度。训练神经网络以输出基于给定输入和理想向量的训练集的某个向量。
如果你真的想把"1 3 5 4 3 5 4"与另一个类似的向量进行比较,我建议你只使用欧几里得距离或类似的测量。
另一方面,如果你确实想训练神经网络来识别某个东西与该模式有多相似,你需要生成更多的训练数据。我会生成1000个左右的案例,并在每个随机案例和上面的向量之间生成欧几里得距离,并将其缩放到百分比。为了获得最佳性能,您还需要将神经网络的输入向量归一化为0到1。
编辑:
以下是我将如何代表这一点。输入神经元的数量等于x轴点的最大数量。但是,您确实需要规范化这些值,所以我建议确定最大Y值,并规范化到0和该值之间。然后,对于你的输出,你将为每一个可能的字母都有一个输出神经元。也许第一个输出神经元是A,第二个是B。然后使用n中的一个编码,将输出神经元中唯一的一个设置为1,其余设置为零:
[input pattern for A] -> [1 0 0]
[input pattern for B] -> [0 1 0]
[input pattern for C] -> [0 0 1]
[another input pattern for C] -> [0 0 1]
将以上内容用作您的训练集。当然,如果你有全部26个字母,那么你就有26个输出。