static void Main(string[] args) { WriteLine("Execution begins"); var fn = @"c:\DEMO\Data\train.csv"; var f = File.ReadLines(fn); var data = from t in f.Skip(1) let zz = t.Split(',').Select(float.Parse) select new Digit { Label = (int)zz.First(), Image = zz.Skip(1).Select(x => x / 256f).ToArray() }; var train = data.Take(40000).ToArray(); var test = data.Skip(40000).Take(1000).ToArray(); WriteLine("Creating network"); DeviceDescriptor device = DeviceDescriptor.CPUDevice; int inputDim = 784; int outputDim = 10; var inputShape = new NDShape(1, inputDim); var outputShape = new NDShape(1, outputDim); Variable features = Variable.InputVariable(inputShape, DataType.Float); Variable label = Variable.InputVariable(outputShape, DataType.Float); var W = new Parameter(new [] { outputDim, inputDim }, DataType.Float, CNTKLib.GlorotUniformInitializer(), device, "w"); var b = new Parameter(new [] { outputDim }, DataType.Float, 0, device, "b"); var z = CNTKLib.Times(W, features) + b; var loss = CNTKLib.CrossEntropyWithSoftmax(z, label); var evalError = CNTKLib.ClassificationError(z, label); CNTK.TrainingParameterScheduleDouble learningRatePerSample = new CNTK.TrainingParameterScheduleDouble(0.02, 1); IList <Learner> parameterLearners = new List <Learner>() { Learner.SGDLearner(z.Parameters(), learningRatePerSample) }; var trainer = Trainer.CreateTrainer(z, loss, evalError, parameterLearners); int minibatchSize = 64; int numMinibatchesToTrain = 500; var feat = new BatchSource <float[]>((from x in train select x.Image).ToArray(), minibatchSize); var labl = new BatchSource <float[]>((from x in train select x.Label.ToOneHot10(10).ToFloatArray()).ToArray(), minibatchSize); var gr = new List <float>(); // train the model for (int ep = 0; ep < numMinibatchesToTrain; ep++) { Value ft, lb; feat.MoveNext(); labl.MoveNext(); ft = Value.CreateBatchOfSequences <float>(inputShape, feat.Current, device); lb = Value.CreateBatchOfSequences <float>(outputShape, labl.Current, device); trainer.TrainMinibatch( new Dictionary <Variable, Value>() { { features, ft }, { label, lb } }, device); if (ep % 50 == 0) { var _loss = trainer.PreviousMinibatchLossAverage(); var _eval = trainer.PreviousMinibatchEvaluationAverage(); WriteLine($"Epoch={ep}, loss={_loss}, eval={_eval}"); gr.Add((float)_loss); } } var G = new GraphLib(); G.Plot(gr, System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line); int count = 0, correct = 0; // Test the model foreach (var x in test) { var imap = new Dictionary <Variable, Value> { { features, Value.CreateBatch(inputShape, x.Image, device) } }; var omap = new Dictionary <Variable, Value> { { z, null } }; z.Evaluate(imap, omap, device); var o = omap[z].GetDenseData <float>(z).First(); var res = o.MaxIndex(); WriteLine("{0} => {1}", x.Label, res); if (x.Label == res) { correct++; } count++; } WriteLine("Done, {0} of {1} correct ({2}%)", correct, count, (double)correct / (double)count * 100); Console.ReadKey(); }
public void Main() { WriteLine("Starting"); var G = new GraphLib(); WriteLine("Generating sample data"); // Создаём случайные точки двух типов float cx1 = -1.0f, cy1 = -1.0f; float cx2 = 1.0f, cy2 = 1.0f; var Rnd = new Random(); var x = new List <float>(); var y = new List <float>(); var lab = new List <float>(); var lab_oh = new List <float[]>(); for (int i = 0; i < 200; i++) { x.Add(cx1 + Rnd.Next(-2.0, 2.0)); y.Add(cy1 + Rnd.Next(-2.0, 2.0)); lab.Add(-1.0f); lab_oh.Add(new float[] { 1.0f, 0.0f }); x.Add(cx2 + Rnd.Next(-2.0, 2.0)); y.Add(cy2 + Rnd.Next(-2.0, 2.0)); lab.Add(1.0f); lab_oh.Add(new float[] { 0.0f, 1.0f }); } G.Plot(x, y); WriteLine("Doing data split"); var x_train = x.Take(150).ToArray(); var y_train = y.Take(150).ToArray(); var l_train = lab.Take(150).ToArray(); var l_oh_train = lab_oh.Take(150).ToArray(); var x_test = x.Skip(150).ToArray(); var y_test = y.Skip(150).ToArray(); var l_test = lab.Skip(150).ToArray(); var l_oh_test = lab_oh.Skip(150).ToArray(); WriteLine("Creating network"); DeviceDescriptor device = DeviceDescriptor.CPUDevice; // Create network model int inputDim = 2; int outputDim = 2; Variable features = Variable.InputVariable(inputDim.AsArray(), DataType.Float); Variable label = Variable.InputVariable(outputDim.AsArray(), DataType.Float); var W = new Parameter(new int[] { outputDim, inputDim }, DataType.Float, 1, device, "w"); var b = new Parameter(new int[] { outputDim }, DataType.Float, 0, device, "b"); var z = CNTKLib.Times(W, features) + b; var loss = CNTKLib.CrossEntropyWithSoftmax(z, label); var evalError = CNTKLib.ClassificationError(z, label); // prepare for training CNTK.TrainingParameterScheduleDouble learningRatePerSample = new CNTK.TrainingParameterScheduleDouble(0.02, 1); IList <Learner> parameterLearners = new List <Learner>() { Learner.SGDLearner(z.Parameters(), learningRatePerSample) }; var trainer = Trainer.CreateTrainer(z, loss, evalError, parameterLearners); int minibatchSize = 64; int numMinibatchesToTrain = 1000; int k = 0; // current position in dataset // train the model for (int ep = 0; ep < numMinibatchesToTrain; ep++) { Value f, l; var fa = new float[minibatchSize * inputDim]; var la = new float[minibatchSize * outputDim]; for (int j = 0; j < minibatchSize; j++) { fa[j * inputDim] = x_train[k]; fa[j * inputDim + 1] = y_train[k]; la[j * outputDim] = l_oh_train[k][0]; la[j * outputDim + 1] = l_oh_train[k][1]; k++; if (k == x_train.Length) { k = 0; } } f = Value.CreateBatch <float>(inputDim.AsArray(), fa, device); l = Value.CreateBatch <float>(outputDim.AsArray(), la, device); trainer.TrainMinibatch( new Dictionary <Variable, Value>() { { features, f }, { label, l } }, device); if (ep % 50 == 0) { var _loss = trainer.PreviousMinibatchLossAverage(); var _eval = trainer.PreviousMinibatchEvaluationAverage(); WriteLine($"Epoch={ep}, loss={_loss}, eval={_eval}"); } } WriteLine("Press any key to exit"); Console.ReadKey(); }