【问题标题】:Bad results using Hopfield network使用 Hopfield 网络的不良结果
【发布时间】:2012-12-28 19:09:48
【问题描述】:

我正在编写一个使用神经网络识别交通标志的程序,但Hopfield 网络存在问题。我正在使用this example 制作我自己的 hopfield 网络。

作为输入,我使用标准化后的那些交通标志,它是一个 50x50 的 01 矩阵。

我遇到的问题是,当 Hopfield 网络将学习 2 种模式时,它可以很好地识别它们,但是当我尝试用超过 2 种模式训练它时,它给了我一个与其中任何一种都不匹配的模式它接受过培训,并为我提供的任何输入返回它。

这是我的代码,与官方 encog 示例中的代码非常相似:

public BiPolarNeuralData convertPattern(double[][] data, int index)
{
    int resultIndex = 0;
    BiPolarNeuralData result = new BiPolarNeuralData(WIDTH*HEIGHT);
    for(int i=0;i<(WIDTH*HEIGHT);i++)
    {
        boolean znak=true;
        if(data[index][i]==1)znak=true;
        else znak=false;
        result.setData(resultIndex++,data[index][i]==1.0);
    }

    return result;
}

public void display(BiPolarNeuralData pattern1,BiPolarNeuralData pattern2)
{
    int index1 = 0;
    int index2 = 0;

    for(int row = 0;row<HEIGHT;row++)
    {
        StringBuilder line = new StringBuilder();

        for(int col = 0;col<WIDTH;col++)
        {
            if(pattern1.getBoolean(index1++))
                line.append('O');
            else
                line.append(' ');
        }

        line.append("   ->   ");

        for(int col = 0;col<WIDTH;col++)
        {
            if(pattern2.getBoolean(index2++))
                line.append('O');
            else
                line.append(' ');
        }

        System.out.println(line.toString());
    }
}


public void evaluate(HopfieldNetwork hopfieldLogic, double[][] pattern)
{
    for(int i=0;i<pattern.length;i++)
    {
        BiPolarNeuralData pattern1 = convertPattern(pattern,i);
        hopfieldLogic.setCurrentState(pattern1);
        int cycles = hopfieldLogic.runUntilStable(100);
        BiPolarNeuralData pattern2 = hopfieldLogic.getCurrentState();
        System.out.println("Cycles until stable(max 100): " + cycles + ", result=");
        display( pattern1, pattern2);
        System.out.println("----------------------");
    }
}

public BasicNetwork trainHopfieldNetwork(){
    HopfieldNetwork hopfieldLogic = new HopfieldNetwork(HEIGHT*WIDTH);

    for(int i=0;i<inputData.length;i++)
    {
        hopfieldLogic.addPattern(convertPattern(inputData,i));
        System.out.println("Pattern : "+i);
    }

    evaluate(hopfieldLogic,inputData);

    return null;
} 

其中inputDataarray[2500] 类型的double

到目前为止我尝试过的是:

  1. 将图案尺寸更改为更小(10x10、20x20)。

  2. 尝试学习不同数量的模式(从 2 到 20)。我总是得到与网络训练的任何模式都不匹配的奇怪结果。

【问题讨论】:

    标签: java neural-network encog


    【解决方案1】:

    所以问题毕竟是网络的学习规则,因为 encog 框架只实现了对复杂网络不太有用的 hebb 学习规则,我不得不实现伪反演学习规则,之后 hopfield 网络开始识别模式烦恼

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 2012-03-04
      • 1970-01-01
      相关资源
      最近更新 更多