Example #1
0
 public void ClassificationUsingSoftmax()
 {
     var inputLayer           = new Linear(1, 12);
     var activationLayer1TanH = new HyperTan();
     var hiddenLayer          = new Linear(12, 1);
     var softmaxLayer         = new SoftMax();
     var model = new Model(new Layer[] { inputLayer, activationLayer1TanH, hiddenLayer, softmaxLayer });
     // implement yourself~~
 }
Example #2
0
        public void RegressionUsingSGD(SinTrainData sinTrainData, bool shuffle_flag, int numEpochs,
                                       ref double[] initialWeights, out double[] finalWeights, bool provideInitialWeights = false)
        {
            var inputLayer           = new Linear(1, 13);
            var activationLayer1TanH = new HyperTan();
            var hiddenLayer1         = new Linear(13, 13);
            var activationLayer2TanH = new HyperTan();
            var hiddenLayer2         = new Linear(13, 1);
            var model = new Model(new Layer[] { inputLayer, activationLayer1TanH, hiddenLayer1, activationLayer2TanH, hiddenLayer2 });

//            var model = new Model(new Layer[] {inputLayer, activationLayer1TanH, hiddenLayer2});
            if (provideInitialWeights)
            {
                model.SetWeights(initialWeights);
            }
            const double learning_rate = 0.005;
            const double momentum      = 0.001; // need more test

            // generate dataSet
//            var sinTrainData = new SinTrainData(); // Inherit from DataSet class:generate 1000 items default
            //generate trainData, testData
            Helper.SplitTrainTest(sinTrainData, 0.8, 1, trainData: out var trainSet, testData: out var testSet);

            var optimizer  = new SGD(model, learning_rate, momentum); // train via sgd
            var dataLoader = new DataLoader(trainSet, 1, shuffle_flag);
            //train using SGD
            var epoch         = 0;
            var epochInternal = 10;

            while (epoch < numEpochs)
            {
                epoch++;
                if (epoch % epochInternal == 0 && epoch > 0) //print epoch & error info
                {
                    var mse = Evaluate.MSE(model, testSet);
                    Console.WriteLine("epoch = " + epoch + " acc = " + (1 - mse).ToString("F4"));
                    //                    Console.WriteLine(" MSE: " + mse.ToString());
                }

                for (int i = 0; i < dataLoader.loopTime; i++)
                {
                    var data = dataLoader.Enumerate(); //[1][x,y]
//                    Console.WriteLine(i);
                    Helper.SplitInputOutput(data, out var inputData, out var outputData);
                    var yPred = model.Forward(inputData[0]); //xValue
//                    Console.WriteLine("framework output:" + yPred.PredictedLinearValues[0]);
                    //compute and print loss
                    var loss = new RegressionLoss(yPred, outputData[0]); //tValue
                    //  Console.WriteLine(loss.Item()); // print loss
                    optimizer.Zero_grad();                               // refresh buffer before .backward()
                    loss.Backward();                                     // calculate grads
                    optimizer.Step();                                    // update weights
                }
            }

            finalWeights = model.GetWeights();


            // test
            var y = model.Forward(new[] { Math.PI }).PredictedLinearValues;

            Console.WriteLine("\nActual sin(PI) =  0.0   Predicted =  " + y[0].ToString("F6"));
        }