public void Model_Use_Case() { var inputShape = new int[] { 28, 28, 1 }; var numberOfClasses = 10; var outputShape = new int[] { numberOfClasses }; (var observations, var targets) = CreateArtificialData(inputShape, outputShape, observationCount: 100); var dataType = DataType.Float; var device = DeviceDescriptor.UseDefaultDevice(); var random = new Random(232); Func <CNTKDictionary> weightInit = () => Initializers.GlorotNormal(random.Next()); var biasInit = Initializers.Zero(); // Create the architecture. var network = Layers.Input(inputShape, dataType) .Dense(512, weightInit(), biasInit, device, dataType) .ReLU() .Dense(numberOfClasses, weightInit(), biasInit, device, dataType) .Softmax(); // setup input and target variables. var inputVariable = network.Arguments[0]; var targetVariable = Variable.InputVariable(network.Output.Shape, dataType); // loss var lossFunc = Losses.CategoricalCrossEntropy(network.Output, targetVariable); var metricFunc = Metrics.Accuracy(network.Output, targetVariable); // setup trainer. var learner = Learners.MomentumSGD(network.Parameters()); var trainer = CNTKLib.CreateTrainer(network, lossFunc, metricFunc, new LearnerVector { learner }); var model = new Model(trainer, network, dataType, device); // setup name to data. var nameToData = new Dictionary <string, MemoryMinibatchData> { { "observations", observations }, { "targets", targets } }; // setup name to variable var nameToVariable = new Dictionary <string, Variable> { { "observations", inputVariable }, { "targets", targetVariable }, }; var trainSource = new MemoryMinibatchSource(nameToVariable, nameToData, seed: 232, randomize: true); model.Fit(trainSource, batchSize: 8, epochs: 2); (var loss, var metric) = model.Evaluate(trainSource); Trace.WriteLine($"Final evaluation - Loss: {loss}, Metric: {metric}"); }
//[TestMethod] public void Fitter_Loop() { var inputShape = new int[] { 28, 28, 1 }; var numberOfClasses = 10; var outputShape = new int[] { numberOfClasses }; (var observations, var targets) = CreateArtificialData(inputShape, outputShape, observationCount: 10000); var dataType = DataType.Float; var device = DeviceDescriptor.UseDefaultDevice(); var random = new Random(232); Func <CNTKDictionary> weightInit = () => Initializers.GlorotNormal(random.Next()); var biasInit = Initializers.Zero(); // Create the architecture. var network = Layers.Input(inputShape, dataType) .Dense(512, weightInit(), biasInit, device, dataType) .ReLU() .Dense(numberOfClasses, weightInit(), biasInit, device, dataType) .Softmax(); // setup input and target variables. var inputVariable = network.Arguments[0]; var targetVariable = Variable.InputVariable(network.Output.Shape, dataType); // loss var loss = Losses.CategoricalCrossEntropy(network.Output, targetVariable); var metric = Metrics.Accuracy(network.Output, targetVariable); // setup trainer. var learner = Learners.MomentumSGD(network.Parameters()); var trainer = CNTKLib.CreateTrainer(network, loss, metric, new LearnerVector { learner }); // data names var observationsName = "observations"; var targetsName = "targets"; // setup name to variable map. var nameToVariable = new Dictionary <string, Variable> { { observationsName, inputVariable }, { targetsName, targetVariable }, }; // setup name to data map. var nameToData = new Dictionary <string, MemoryMinibatchData> { { observationsName, observations }, { targetsName, targets } }; var minibatchSource = new MemoryMinibatchSource(nameToVariable, nameToData, seed: 232, randomize: true); // setup Fitter var fitter = new Fitter(trainer, device); // variables for training loop. var inputMap = new Dictionary <Variable, Value>(); var epochs = 10; int batchSize = 32; for (int epoch = 0; epoch < epochs;) { var(minibatch, isSweepEnd) = minibatchSource.GetNextMinibatch(batchSize, device); fitter.FitNextStep(minibatch, batchSize); if (isSweepEnd) { var currentLoss = fitter.CurrentLoss; var currentMetric = fitter.CurrentMetric; fitter.ResetLossAndMetricAccumulators(); var traceOutput = $"Epoch: {epoch + 1:000} Loss = {currentLoss:F8}, Metric = {currentMetric:F8}"; ++epoch; Trace.WriteLine(traceOutput); } } }