Плохие результаты при использовании сети Хопфилда

Я пишу программу, которая распознает дорожные знаки, используя нейронные сети, и у меня проблема с Hopfield сеть. Я использую этот пример для создания собственной сети хопфилдов.

В качестве входных данных я использую эти дорожные знаки после нормализации, и это матрица 50x50 0 а также 1,

Проблема, с которой я сталкиваюсь, состоит в том, что, когда сеть Хопфилда изучает 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;
} 

куда inputData является array[2500] типа double,

Что я пробовал до сих пор:

  1. Изменение размера узоров на меньшие (10х10, 20х20).

  2. Попытка выучить разное количество паттернов (от 2 до 20). Я всегда получаю странные результаты, которые не соответствуют ни одному из шаблонов, на которых обучалась сеть.

1 ответ

В конце концов, проблема заключалась в правиле обучения сети, так как в структуре encog реализовано только правило обучения hebb, которое не очень полезно для сложных сетей, мне пришлось реализовать правило обучения псевдообращения, и после этого сеть hopfield начала распознавать шаблоны без проблем.

Другие вопросы по тегам