none
Добавление делегатов в цикле RRS feed

  • Вопрос

  • Всем Добрый День!

     

    При моделировании искусственной нейронной сети столкнулся с таким странным поведением при добавлении к каждому нейрону в цикле делегата. Сейчас код переписал без циклов, но это не есть хорошо.

    К сожалению старая версия с циклами не сохранилась. Сейчас это выглядит так:

          Layer1.Add(new Neuron(10));
                for (int i = 0; i < 10; i++)
                {
                    Layer1[0].X[i] = Layer0[i].OUT;
                    Layer1[0].W[i] = 1;
                }

                Layer1[0].activationFunction = new Neuron.ActivationFunction(
                        delegate
                        {
                            double sum = 0;
                            for (int i = 0; i < Layer1[0].X.Count/2; i++)
                            {
                                if (Layer1[0].X[i] == 1)
                                {
                                    sum += Layer1[0].X[i] * Layer1[0].W[i];
                                }
                                else if (Layer1[0].X[i + 5] == 1)
                                {
                                    sum += Layer1[0].X[i + 5] * Layer1[0].W[i];
                                }
                            }
                            sum = sum / Layer1[0].X.Count;

                            if(sum >= 0.5) return 1;
                            else return sum;
                        });

    У части нейронов активационные функции (выход нейрона) одинаковые, собственно активационная функция и назначается с помощью делегата. Отличия ряда нейронов только во входах, они идут с разных выходов нейронов предыдущего слоя. Соответственно их инициализацию я попытался написать с помощью цикла. Тут видно что все действия идут с нулевым нейроном первого слоя.

    Дак вот собственно проблема, которую я до конца так и не понял:

    Все ниже написанное относится к случаю, если вся инициализация написана через циклы.

    Если выполнять программу по шагам в режиме отладки, то во время определения делегатов, они нормально подставляются во все нейроны. Когда  же цикл заканчивается, то все делегаты у нейронов пропадают. Абсолютно все...

    Однако, если выполнять программу по прежнему в режиме отладки, но пропустить несколько итераций цикла (зажать F10/F11), то делегаты не назначаются нейронам.

     

    Почему такое странное поведение? Причем поведение чего, я так и не понял...

     

    Буду благодарен за любую помощь!

    Всем заранее спасибо!


    E-mail: Svatoslav.Pankratov@gmail.com
    27 ноября 2010 г. 12:27

Ответы

Все ответы

  • Если код не совсем понятен, то вот код, в котором выявлена, описанная выше проблема:

    	  Layer1 = new List<Neuron>(6);

                // Эксперимент
                for (int j = 0; j < 2; j++)
                {
                    Layer1.Add(new Neuron(10));
                    for (int i = 0; i < 10; i++)
                    {
                        if (j == 0) Layer1[j].X[i] = Layer0[i].OUT;
                        if (j == 1) Layer1[j].X[i] = Layer0[i + 15].OUT;
                        Layer1[j].W[i] = 1;
                    }

                    Layer1[j].activationFunction = new Neuron.ActivationFunction(
                            delegate
                            {
                                double sum = 0;
                                for (int i = 0; i < Layer1[j].X.Count / 2; i++)
                                {
                                    if (Layer1[j].X[i] == 1)
                                    {
                                        sum += Layer1[j].X[i] * Layer1[j].W[i];
                                    }
                                    else if (Layer1[j].X[i + 5] == 1)
                                    {
                                        sum += Layer1[j].X[i + 5] * Layer1[j].W[i];
                                    }
                                }
                                sum = sum / Layer1[j].X.Count;

                                if (sum >= 0.5) return 1;
                                else return sum;
                            });
                }

    Внутри цикла, все два делегата есть. Как только программа выходит из цикла, делегаты внутри нейронов пропадают. Если код разложить без цикла, то все хорошо работает.
    E-mail: Svatoslav.Pankratov@gmail.com
    27 ноября 2010 г. 21:52
  • Проблема решена. См тут.
    E-mail: Svatoslav.Pankratov@gmail.com
    • Помечено в качестве ответа Svyatoslav Pankratov 27 ноября 2010 г. 23:05
    27 ноября 2010 г. 23:05