Моя функция стоимости не может минимизироваться ниже 0,2. Я использую набор данных IRIS для тестирования своей сети - PullRequest
1 голос
/ 02 октября 2019

Это моя первая нейронная сеть, и я построил ее на Java без использования пакетов ML. Это мой первый опыт в области ML или глубокого обучения.

Когда я передаю одну точку данных в качестве входных данных, функция стоимости минимизируется до 10 ^ -5, но как только я начинаю добавлять больше точек данных, функция стоимости значительно увеличивается и точностьуменьшается.

Я заметил, что градиенты веса и смещения исчезают. Изменить: моя сеть работает с 2 слоями, но когда я добавляю больше слоев, стоимость увеличивается. Почему это?

import java.util.*;
public class backprop
{
    Network hidden[];double learningrate; double expects[];
    backprop(Network k[],double learn,double expected[])
    {
        hidden=k;learningrate=learn;expects=expected;
    }

    double dsigmoid(double x)
    {
        return(x*(1.0-x));
    }

    void expect()
    {
        Scanner in=new Scanner(System.in);
        hidden[hidden.length-1].expected=new double[expects.length];
        hidden[hidden.length-1].expected=expects;
        /*for(int a=0;a<hidden[hidden.length-1].expected.length;a++)
        {
        //System.out.println("expected:"+(a+1));
        hidden[hidden.length-1].expected[a]=expects[a];
        }*/
    }

    void error(int a)
    {
        hidden[a].error=new double[hidden[a].weightsum.length];
        Matrix A=new Matrix(hidden[a].expected,hidden[a].weightsum.length,0);
        Matrix B=new Matrix(hidden[a].weightsum,hidden[a].weightsum.length,0);
        Matrix C=B.minus(A);
        hidden[a].error=C.toSDA().data1;
    }

    void hiddenerror(int a)
    {
        hidden[a].error=new double[hidden[a].weightsum.length];double ary[]=new double[hidden[a+1].weightsum.length];
        for(int a1=0;a1<hidden[a+1].weightsum.length;a1++)
        {
            for(int a2=0;a2<hidden[a].weightsum.length;a2++)
                 ary[a1]+=hidden[a].link[a2].weight[a1];
        }
        for(int a1=0;a1<hidden[a].weightsum.length;a1++)
        {
            for(int a2=0;a2<hidden[a+1].weightsum.length;a2++)
                hidden[a].error[a1]+=(hidden[a].link[a1].weight[a2]/(ary[a2]))*hidden[a+1].error[a2];
        }
    }
    //check again
    void changeweights(int a)
    {
        for(int a2=0;a2<hidden[a+1].weightsum.length;a2++)
        {
            for(int a1=0;a1<hidden[a].weightsum.length;a1++)
            {
               // System.out.println(hidden[a+1].error[a2]*dsigmoid(hidden[a+1].weightsum[a2])*hidden[a].weightsum[a1]+" ");
                hidden[a].link[a1].weight[a2]=hidden[a].link[a1].weight[a2]-(learningrate*hidden[a+1].error[a2]*dsigmoid(hidden[a+1].weightsum[a2])*hidden[a].weightsum[a1]);
            }
        }for(int a1=0;a1<hidden[a+1].weightsum.length;a1++)
        {
            //System.out.println(hidden[a+1].error[a1]*dsigmoid(hidden[a+1].weightsum[a1])+" ");
            hidden[a+1].link[a1].bias=hidden[a+1].link[a1].bias-(learningrate*hidden[a+1].error[a1]*dsigmoid(hidden[a+1].weightsum[a1]));
        } System.out.println();
    }

    void main()
    {
        expect();double cost=0;
        error(hidden.length-1);
        for(int a=hidden.length-2;a>0;a--)
            hiddenerror(a);
        for(int a=hidden.length-2;a>=0;a--)
            changeweights(a);
        for(int a=0;a<hidden[hidden.length-1].error.length;a++)
        {cost+=Math.pow(hidden[hidden.length-1].error[a],2);
            //System.out.print(hidden[hidden.length-1].error[a]+" ");
        }
        cost=cost/hidden[hidden.length-1].error.length;
        System.out.println(cost);
    }
}

...