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~~ }
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")); }