Beispiel #1
0
        static void  test2D()
        {
            float[][][,] x = JsonConvert.DeserializeObject <float[][][, ]>(getstr("D:\\x.json"));
            float[][][,] y = JsonConvert.DeserializeObject <float[][][, ]>(getstr("D:\\y.json"));
            float[][][,] w = JsonConvert.DeserializeObject <float[][][, ]>(getstr("D:\\w1.json"));
            float[] wb = JsonConvert.DeserializeObject <float[]>(getstr("D:\\w2.json"));

            Conv2DLayer cl = new Conv2DLayer(1, 1, 3, 1, 2, false);

            MSELoss mloss = new MSELoss();

            cl.weights = new float[w.GetLength(0)][][, ];
            for (int a = 0; a < w.GetLength(0); a++)
            {
                cl.weights[a] = new float[w[0].GetLength(0)][, ];
                for (int b = 0; b < w[a].GetLength(0); b++)
                {
                    cl.weights[a][b] = new float[0, 0];
                    cl.weights[a][b] = w[a][b];
                }
            }
            cl.basicData = wb;
            //向前传播
            dynamic temp = cl.Forward(x);

            SigmodLayer sl = new SigmodLayer();

            temp = sl.Forward(temp);

            //TanhLayer tl = new TanhLayer();
            //temp = tl.forward(temp);

            //MulLayer ml = new MulLayer();
            //temp = ml.forward(temp, y);

            float loss = mloss.Forward(temp, y);


            //向后传播
            dynamic grad = mloss.Backward();//计算误差梯度

            grad = sl.Backward(grad);
            //grad = ml.backward(grad);



            //grad = tl.backward(grad);

            dynamic grad3 = cl.backward(grad);//卷积计算在 所有计算的最后面进行

            prirt(grad3.grid);
            prirt(grad3.basic);
        }
Beispiel #2
0
        /// <summary>
        /// BP网络测试
        /// </summary>
        static void BP()
        {
            float[][] x  = JsonConvert.DeserializeObject <float[][]>(util.getstr("D:\\bpx.json")); //训练数据
            float[][] y  = JsonConvert.DeserializeObject <float[][]>(util.getstr("D:\\bpy.json")); //训练标签
            float[][] w1 = JsonConvert.DeserializeObject <float[][]>(util.getstr("D:\\bpw.json"));


            ConvLayer cl1 = new ConvLayer(13, 5, true);

            cl1.weights = w1;
            SigmodLayer sl  = new SigmodLayer();
            float       lr  = 0.5f;
            ConvLayer   cl2 = new ConvLayer(5, 1, true);
            //SigmodLayer s2 = new SigmodLayer();
            int i = 0, a = 0;

            while (a < 5000)
            {
                //i = 0;
                //while (i < 100)
                //{
                //    float[][] xx2 = new float[1][];
                //    xx2[0] = new float[x[0].GetLength(0)];

                //    for (var f = 0; f < x[0].GetLength(0); f++)
                //    {

                //        xx2[0][f] = x[i][f];
                //    }
                dynamic ff = cl1.Forward(x);
                ff = sl.Forward(ff);
                ff = cl2.Forward(ff);
                // dynamic ff22 = s2.forward(ff);
                //计算误差
                MSELoss mloss = new MSELoss();
                //float[][] yy2= new float[1][];
                //yy2[0] = y[i];
                var loss = mloss.Forward(ff, y);

                Console.WriteLine("误差:" + loss);

                dynamic grid = mloss.Backward();

                //反传播w2
                //  dynamic grid2 =s2.backward(grid);
                dynamic w22 = cl2.backweight(grid);

                //反传播W1
                dynamic grid1 = cl2.backward(grid);
                grid1 = sl.Backward(grid1);
                dynamic w11 = cl1.backweight(grid1);


                cl2.weights   = Matrix.MatrixSub(cl2.weights, Matrix.multiply(w22.grid, lr));
                cl2.basicData = Matrix.MatrixSub(cl2.basicData, Matrix.multiply(w22.basic, lr));

                cl1.weights   = Matrix.MatrixSub(cl1.weights, Matrix.multiply(w11.grid, lr));
                cl1.basicData = Matrix.MatrixSub(cl1.basicData, Matrix.multiply(w11.basic, lr));
                i++;
                // }
                a++;
            }

            //测试网络
            float[][] xx = new float[1][];
            xx[0] = new float[x[0].GetLength(0)];
            var aa = 3;

            for (var f = 0; f < x[0].GetLength(0); f++)
            {
                xx[0][f] = x[aa][f];
            }
            dynamic ff2 = cl1.Forward(xx);

            ff2 = sl.Forward(ff2);
            ff2 = cl2.Forward(ff2);

            util.prirt(ff2);
            util.prirt(y[aa]);
        }