示例#1
0
        public string TrainModel(IpfsJob job)
        {
            var tmpInput  = Ipfs.Get <JToken>(job.input);
            var tmpTarget = Ipfs.Get <JToken>(job.target);

            var seq = CreateSequential(job.Model);

            var inputData   = tmpInput.SelectToken("data").ToObject <float[]>();
            var inputShape  = tmpInput.SelectToken("shape").ToObject <int[]>();
            var inputTensor = controller.floatTensorFactory.Create(_data: inputData, _shape: inputShape, _autograd: true);

            var targetData   = tmpTarget.SelectToken("data").ToObject <float[]>();
            var targetShape  = tmpTarget.SelectToken("shape").ToObject <int[]>();
            var targetTensor = controller.floatTensorFactory.Create(_data: targetData, _shape: targetShape, _autograd: true);

            var grad = controller.floatTensorFactory.Create(_data: new float[] { 1, 1, 1, 1 },
                                                            _shape: new int[] { 4, 1 });

            Loss loss;

            switch (job.config.criterion)
            {
            case "mseloss":
                loss = new MSELoss(this.controller);
                break;

            case "categorical_crossentropy":
                loss = new CategoricalCrossEntropyLoss(this.controller);
                break;

            case "cross_entropy_loss":
                loss = new CrossEntropyLoss(this.controller, 1);     // TODO -- real value
                break;

            case "nll_loss":
                loss = new NLLLoss(this.controller);
                break;

            default:
                loss = new MSELoss(this.controller);
                break;
            }

            var optimizer = new SGD(this.controller, seq.getParameters(), job.config.lr, 0, 0);

            for (var i = 0; i < job.config.iters; ++i)
            {
                var pred = seq.Forward(inputTensor);
                var l    = loss.Forward(pred, targetTensor);
                l.Backward();

                // TODO -- better batch size
                optimizer.Step(100, i);
            }

            var resultJob = new Ipfs();
            var response  = resultJob.Write(new IpfsJob(job.input, job.target, seq.GetConfig(), job.config));

            return(response.Hash);
        }
示例#2
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);
        }
示例#3
0
        static void Main(string[] args)
        {
            string[] files = System.IO.Directory.GetFiles("res");
            files = files.OrderBy(p => p).ToArray();
            float[][][,] datax = new float[1][][, ];
            float[][][,] datah = new float[1][][, ];
            float[][][,] datac = new float[1][][, ];
            float[][][,] datay = new float[1][][, ];
            datax[0]           = new float[10][, ];
            datah[0]           = new float[10][, ];
            datac[0]           = new float[10][, ];
            datay[0]           = new float[10][, ];
            MSELoss  mloss    = new MSELoss();
            ConvLSTM convLSTM = new ConvLSTM(10, 10, 5);

            for (int r = 0; r < files.Length - 10; r++)
            {
                for (int t = 0; t < 10; t++)
                {
                    string file = files[r + t];
                    float[,] anno1 = DenseCRF.util.readRADARMatrix(file);
                    datax[0][t]    = anno1;
                    datah[0][t]    = new float[anno1.GetLength(0), anno1.GetLength(1)];
                    datac[0][t]    = new float[anno1.GetLength(0), anno1.GetLength(1)];
                    file           = files[r + t + 10];
                    datay[0][t]    = DenseCRF.util.readRADARMatrix(file);
                }

                var star = DateTime.Now;
                var(h_next, c_next) = convLSTM.Forward(datax, datah, datac);
                var loss = mloss.Forward(h_next, datay);
                Console.WriteLine("误差:" + loss);
                var grid  = mloss.Backward();
                var grid2 = convLSTM.backward(grid);
                convLSTM.update();
                var end = DateTime.Now;
                Console.WriteLine((end - star).TotalMilliseconds);
            }
        }
示例#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]);
        }
示例#5
0
        static void 单层()
        {
            // float[][][] prev_state = new float[2][][];
            LSTMCELL lstm1 = new LSTMCELL(7, 1);
            LSTMCELL lstm2 = new LSTMCELL(10, 1);
            //var x_numpy = JsonConvert.DeserializeObject<float[][]>(util.getstr("D:\\x_numpy.json"));
            //var h_numpy = JsonConvert.DeserializeObject<float[][]>(util.getstr("D:\\h_numpy.json"));
            //var c_numpy = JsonConvert.DeserializeObject<float[][]>(util.getstr("D:\\c_numpy.json"));
            //var dh_numpy = JsonConvert.DeserializeObject<float[][]>(util.getstr("D:\\dh_numpy.json"));
            var x_numpy  = new float[1][];
            var h_numpy  = new float[1][];
            var c_numpy  = new float[1][];
            var h_numpy2 = new float[1][];
            var c_numpy2 = new float[1][];

            var dh_numpy = new float[1][];
            var dataall  = getdata();

            for (int i = 0; i < 30000; i++)
            {
                for (int j = 0; j < 1; j++)
                {
                    h_numpy[j]  = new float[1];
                    h_numpy2[j] = new float[1];
                }

                for (int j = 0; j < 1; j++)
                {
                    c_numpy[j]  = new float[1];
                    c_numpy2[j] = new float[1];
                }
                var     loss  = 0.0f;
                MSELoss mloss = new MSELoss();
                for (int j = 0; j < 10; j++)
                {
                    x_numpy[0] = dataall[j + i];

                    var dhgird = lstm1.Forward(x_numpy, h_numpy, c_numpy);

                    h_numpy     = dhgird.Item1;
                    c_numpy     = dhgird.Item2;
                    dh_numpy[0] = new float[] { dataall[i + j + 1][0] };
                    loss       += mloss.Forward(h_numpy, dh_numpy);

                    var gird = mloss.Backward();
                    lstm1.backward(gird);
                    lstm1.update();
                }

                Console.WriteLine("误差:" + loss);
            }
            for (int i = 30000; i < 40000; i++)
            {
                for (int j = 0; j < 1; j++)
                {
                    h_numpy[j] = new float[1];
                }

                for (int j = 0; j < 1; j++)
                {
                    c_numpy[j] = new float[1];
                }
                var     loss  = 0.0f;
                MSELoss mloss = new MSELoss();

                for (int j = 0; j < 10; j++)
                {
                    x_numpy[0]  = dataall[j + i];
                    dh_numpy[0] = new float[] { dataall[j + i + 1][0] };
                    var dhgird = lstm1.Forward(x_numpy, h_numpy, c_numpy);
                    h_numpy = dhgird.Item1;
                    c_numpy = dhgird.Item2;
                    //fff += c_numpy[0][0];


                    //var gird = mloss.Backward();
                    //lstm.backward(gird);
                }
                loss += mloss.Forward(h_numpy, dh_numpy);
                Console.WriteLine("误差:" + loss + ",预测:" + (h_numpy[0][0]) * 1000 + ",期望:" + (dh_numpy[0][0]) * 1000);
            }
        }
示例#6
0
        static void 单层()
        {
            // float[][][] prev_state = new float[2][][];
            GRU gru = new GRU(7, 15, 1);

            var x_numpy = new float[1][];
            var h_numpy = new float[1][];

            var h_numpy2 = new float[1][];

            var dh_numpy = new float[1][];
            var dataall  = getdata();

            for (int i = 0; i < 35000; i++)
            {
                for (int j = 0; j < 1; j++)
                {
                    h_numpy[j]  = new float[15];
                    h_numpy2[j] = new float[15];
                }


                var     loss  = 0.0f;
                MSELoss mloss = new MSELoss();
                for (int j = 0; j < 10; j++)
                {
                    x_numpy[0] = dataall[j + i];

                    var dhgird = gru.Forward(x_numpy, h_numpy);

                    h_numpy = dhgird.Item2;
                    // c_numpy = dhgird.Item2;
                    dh_numpy[0] = new float[] { dataall[i + j + 1][0] };
                    loss       += mloss.Forward(dhgird.Item1, dh_numpy);

                    var gird = mloss.Backward();
                    gru.backward(gird);
                    gru.update();
                }

                Console.WriteLine("误差:" + loss);
            }
            for (int i = 35000; i < 40000; i++)
            {
                for (int j = 0; j < 1; j++)
                {
                    h_numpy[j] = new float[15];
                }


                var     loss  = 0.0f;
                MSELoss mloss = new MSELoss();
                dynamic DY    = null;
                for (int j = 0; j < 10; j++)
                {
                    x_numpy[0]  = dataall[j + i];
                    dh_numpy[0] = new float[] { dataall[j + i + 1][0] };
                    var dhgird = gru.Forward(x_numpy, h_numpy);
                    h_numpy = dhgird.Item2;
                    DY      = dhgird.Item1;
                }
                loss += mloss.Forward(DY, dh_numpy);
                Console.WriteLine("误差:" + loss + ",预测:" + (DY[0][0]) * 1000 + ",期望:" + (dh_numpy[0][0]) * 1000);
            }
        }