CSharp - 如何使用Hopfield网络了解更多的模式?

  显示原文与译文双语对照的内容
0 0

神经元数与Hopfield网络识别模式的能力有什么关系?

在 C# 中编写神经网络程序用Hopfield网络识别模式。 我的网络有 64个神经元。 当我训练网络为 2个模式时,每一件事都非常容易,但是当我训练网络时,网络无法找到。

我的代码是如何利用Hopfield网络来学习更多的模式?

我应该在这里代码中进行更改?

我的train() 函数有:


public void Train(bool[,] pattern)
{
//N is number of rows in our square matrix
//Convert input pattern to bipolar
 int[,] PatternBipolar = new int[N, N];

 for (int i = 0; i <N; i++)
 for (int j = 0; j <N; j++)
 {
 if (pattern[i, j] == true)
 {
 PatternBipolar[i, j] = 1;
 }
 else
 {
 PatternBipolar[i, j] = -1;
 }
 }

//convert to row matrix
 int count1 = 0;
 int[] RowMatrix = new int[(int)Math.Pow(N, 2)];
 for (int j = 0; j <N; j++)
 for (int i = 0; i <N; i++)
 {
 RowMatrix[count1] = PatternBipolar[i, j];
 count1++;
 }

//convert to column matrix
 int count2 = 0;
 int[] ColMatrix = new int[(int)Math.Pow(N, 2)];
 for (int j = 0; j <N; j++)
 for (int i = 0; i <N; i++)
 {
 ColMatrix[count2] = PatternBipolar[i, j];
 count2++;
 }

//multiplication
 int[,] MultipliedMatrix = new int[(int)Math.Pow(N, 2), (int)Math.Pow(N, 2)];
 for (int i = 0; i <(int)Math.Pow(N, 2); i++)
 for (int j = 0; j <(int)Math.Pow(N, 2); j++)
 {
 MultipliedMatrix[i, j] = ColMatrix[i] * RowMatrix[j];
 }

//cells in the northwest diagonal get set to zero
 for (int i = 0; i <(int)Math.Pow(N, 2); i++)
 MultipliedMatrix[i, i] = 0;

//WightMatrix + MultipliedMatrix

 for (int i = 0; i <(int)Math.Pow(N, 2); i++)
 for (int j = 0; j <(int)Math.Pow(N, 2); j++)
 {
 WeightMatrix[i, j] += MultipliedMatrix[i, j];
 }

还有 Present() 函数( 这里函数用于返回给定 Pattern的应答):


public void Present(bool[,] Pattern)
{
 int[] output = new int[(int)(int)Math.Pow(N, 2)];

 for (int j = 0; j <N; j++)
 for (int i = 0; i <N; i++)
 {
 OutputShowMatrix[i, j] = 0;
 }

//convert bool to binary
 int[] PatternBinary = new int[(int)Math.Pow(N, 2)];
 int count = 0;
 for (int j = 0; j <N; j++)
 for (int i = 0; i <N; i++)
 {
 if (Pattern[i, j] == true)
 {
 PatternBinary[count] = 1;
 }
 else
 {
 PatternBinary[count] = 0;
 }
 count++;
 }

 count = 0;
 int activation = 0;
 for (int j = 0; j <(int)Math.Pow(N, 2); j++)
 {
 for (int i = 0; i <(int)Math.Pow(N, 2); i++)
 {
 activation = activation + (PatternBinary[i] * WeightMatrix[i, j]);
 }

 if (activation> 0)
 {
 output[count] = 1;
 }
 else
 {
 output[count] = 0;
 }

 count++;
 activation = 0;
 }

 count = 0;
 for (int j = 0; j <N; j++)
 for (int i = 0; i <N; i++)
 {
 OutputShowMatrix[i, j] = output[count++];
 }

在下面的图像中,我用 true 训练字符A 和P,当输入模式像A 或者P 时,网络以方式识别它们 enter image description hereenter image description here

然后我训练它为字符 C: enter image description here

这是所有事情都发生错误的地方 !

现在,如果输入 Pattern 类似于C,则会发生这里问题: enter image description here

如果输入 Pattern,请看发生了什么: enter image description here

如果训练更多的图案整个网格变成黑色 !

时间: 原作者:

0 0

我在你的代码中只发现了一个错误: 在不验证值是否已经收敛的情况下,只执行一次节点值计算的迭代。 我已经将这里方法修复为:


public bool[,] Present(bool[,] pattern)
{
 bool[,] result = new bool[N, N];
 int[] activation = new int[N * N];

 int count = 0;
 for (int i = 0; i <N; i++)
 for (int j = 0; j <N; j++)
 {
 activation[count++] = pattern[i, j]? 1 : 0;
 }

 bool convergence = false;
 while (!convergence)
 {
 convergence = true;
 var previousActivation = (int[])activation.Clone();
 for (int i = 0; i <N * N; i++)
 {
 activation[i] = 0;
 for (int j = 0; j <N * N; j++)
 {
 activation[i] += (previousActivation[j] * WeightMatrix[i, j]);
 }

 activation[i] = activation[i]> 0? 1 : 0;

 if (activation[i]!= previousActivation[i])
 {
 convergence = false;
 }
 }
 }

 count = 0;
 for (int i = 0; i <N; i++)
 for (int j = 0; j <N; j++)
 {
 result[i, j] = activation[count++] == 1;
 }

 return result;
}

这稍微改进了结果,但是也可能需要改进以异步计算值以避免循环。

不幸的是,这仍然介绍了你所描述的行为。 这是由所谓的虚假模式产生的。 为了让网络学习多个 Pattern,考虑用Hebb规则训练它。 你可以阅读关于网络的伪模式,稳定性和学习,这里是和

原作者:
...