private static void TrainModel(DeviceDescriptor device, PreparedDataInfo preparedData, NetworkBuildOutput buildOutput, Trainer trainer) { const uint minibatchSize = 64; const int outputFrequencyInMinibatches = 20; var i = 0; var epochs = 5; while (epochs > 0) { var minibatchData = preparedData.MinibatchSource.GetNextMinibatch(minibatchSize, device); var arguments = new Dictionary <Variable, MinibatchData> { { buildOutput.Input, minibatchData[preparedData.FeatureStreamInfo] }, { buildOutput.Labels, minibatchData[preparedData.LabelStreamInfo] } }; trainer.TrainMinibatch(arguments, device); PrintTrainingProgress(trainer, i++, outputFrequencyInMinibatches); // MinibatchSource is created with MinibatchSource.InfinitelyRepeat. // Batching will not end. Each time minibatchSource completes an sweep (epoch), // the last minibatch data will be marked as end of a sweep. We use this flag // to count number of epochs. if (MiniBatchDataIsSweepEnd(minibatchData.Values)) { epochs--; } } }
private static Trainer CreateTrainer(NetworkBuildOutput buildOutput) { var parameters = buildOutput.ClassifierOutput.Parameters(); var parameterLearners = CreateLerners(parameters); var trainer = Trainer.CreateTrainer(buildOutput.ClassifierOutput, buildOutput.TrainingLoss, buildOutput.Prediction, parameterLearners); return(trainer); }
public NetworkBuildOutput Build(DeviceDescriptor device, string featureStreamName, string labelsStreamName, string classifierName, int numClasses, int[] imageDim) { var buildOutput = new NetworkBuildOutput(); buildOutput.Input = CNTKLib.InputVariable(imageDim, DataType.Float, featureStreamName); buildOutput.ScaledInput = CNTKLib.ElementTimes(Constant.Scalar(0.00390625f, device), buildOutput.Input); buildOutput.ClassifierOutput = CreateConvolutionNeuralNetwork(buildOutput.ScaledInput, numClasses, device, classifierName); buildOutput.Labels = CNTKLib.InputVariable(new[] { numClasses }, DataType.Float, labelsStreamName); buildOutput.TrainingLoss = CNTKLib.CrossEntropyWithSoftmax(new Variable(buildOutput.ClassifierOutput), buildOutput.Labels, "lossFunction"); buildOutput.Prediction = CNTKLib.ClassificationError(new Variable(buildOutput.ClassifierOutput), buildOutput.Labels, "classificationError"); return(buildOutput); }
private static void SaveModel(NetworkBuildOutput buildOutput, string modelFile) { buildOutput.ClassifierOutput.Save(modelFile); }