4

我正在使用 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]) ;
}

再次回到我的问题:

我如何输入另一个模式,看看它是否看起来像我的?

欢迎任何可能导致我找到解决方案的想法。谢谢

4

1 回答 1

1

我不确定我是否完全遵循这一点。你有比这更多的模式吗?或者你的训练集只是一种模式,而你只是想看看其他模式与它有多么相似?神经网络并不真正比较模式之间的相似程度。基于给出输入和理想向量的训练集,训练神经网络以输出一些向量。

如果您确实只想将“1 3 5 4 3 5 4 3”与另一个类似的向量进行比较,我建议您只使用欧几里得距离或类似的测量值。

另一方面,如果您确实想训练神经网络以识别某事物与该模式的相似程度,您将需要生成更多的训练数据。我会生成 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 个输出。

于 2014-10-06T21:31:49.863 回答