Beispiel #1
0
        public dynamic Forward(float[][] input, float[][] h_prev, float[][] c_prev)
        {
            //a_vector = np.dot(x, self.weight_ih.T) + np.dot(h_prev, self.weight_hh.T)
            //a_vector += self.bias_ih + self.bias_hh
            Xinput  = input;
            xh_prev = h_prev;
            xc_prev = c_prev;
            var ih       = convLayerih.Forward(input);
            var hh       = convLayerhh.Forward(h_prev);
            var a_vector = Matrix.MatrixAdd(ih, hh);

            List <float[][]> liast = Matrix.chunk(a_vector, 4, 1);
            var a_i = liast[0];
            var a_f = liast[1];
            var a_c = liast[2];
            var a_o = liast[3];

            input_gate  = input_gate_s.Forward(a_i);
            forget_gate = forget_gate_s.Forward(a_f);
            cell_memory = cell_memory_tl.Forward(a_c);
            output_gate = output_gate_s.Forward(a_o);
            var c_next_temp = c_next_mul.Forward(forget_gate, c_prev);
            var mulin_gate  = mulin_gate_mul.Forward(input_gate, cell_memory);
            var c_next      = Matrix.MatrixAdd(c_next_temp, mulin_gate);

            var h_next = h_next_mul.Forward(output_gate, cell_tl.Forward(c_next));

            // dh_prev = Matrix.zroe(h_next.Length, h_next[0].Length);
            return(h_next, c_next);//上次的状态,上次的记忆
        }
Beispiel #2
0
        //MulLayer ZHZTL = new MulLayer();
        public (dynamic, dynamic) Forward(float[][] input, float[][] state)
        {
            var H  = state;
            var X  = convLayerih.Forward(input);
            var HH = convLayerhh.Forward(H);
            List <float[][]> listX  = Matrix.chunk(X, 3, 1);
            List <float[][]> listHH = Matrix.chunk(HH, 3, 1);
            var ZS = Matrix.MatrixAdd(listX[0], listHH[0]);
            var Z  = ZSL.Forward(ZS);

            var RS = Matrix.MatrixAdd(listX[1], listHH[1]);
            var R  = RSL.Forward(RS);

            var RH      = RHM.Forward(R, listHH[2]);
            var RHS     = Matrix.MatrixAdd(listX[2], RH);
            var H_tilda = THL.Forward(RHS);

            var ZH = ZHL.Forward(Z, H);

            var Z1  = Matrix.MatrixSub(1, Z);
            var ZHT = ZHTL.Forward(Z1, H_tilda);

            H = Matrix.MatrixAdd(ZH, ZHT);
            var Y = convLayerhq.Forward(H);

            return(Y, H);
        }
        public void ForwardBackwardTest()
        {
            var input = new TensorOld(new double[]
            {
                4, 6, 1, 4,
                8, 4, 5, 1,
                5, 3, 5, 7,
                1, 7, 2, 8,
            }, 1, 1, 4, 4);

            var conv = new ConvLayer(4, 2, 1, 1);

            conv.SetFilters(new TensorOld(new double[]
            {
                1, 1, 0, 0,
                0, 0, 1, 1,
                1, 0, 1, 0,
                0, 1, 0, 1,
            }, 4, 1, 2, 2));

            var expected = new TensorOld(new double[]
            {
                0, 0, 0, 0, 0,
                4, 10, 7, 5, 4,
                8, 12, 9, 6, 1,
                5, 8, 8, 12, 7,
                1, 8, 9, 10, 8,

                4, 10, 7, 5, 4,
                8, 12, 9, 6, 1,
                5, 8, 8, 12, 7,
                1, 8, 9, 10, 8,
                0, 0, 0, 0, 0,

                0, 4, 6, 1, 4,
                0, 12, 10, 6, 5,
                0, 13, 7, 10, 8,
                0, 6, 10, 7, 15,
                0, 1, 7, 2, 8,

                4, 6, 1, 4, 0,
                12, 10, 6, 5, 0,
                13, 7, 10, 8, 0,
                6, 10, 7, 15, 0,
                1, 7, 2, 8, 0,
            }, 1, 4, 5, 5);

            conv.PrepareTrain(input);
            var acutal = conv.Forward(input);

            Assert.Equal(acutal, expected);

            var error = expected / 10;
            var back  = conv.Backward(error);
        }
Beispiel #4
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]);
        }