static void Main(string[] args) { //Generate the training data int keySize = 64; int messageSize = 64; int trainingSetSize = 100; List <Triplet> trainingSet = GenerateDESDataset(trainingSetSize, keySize, messageSize); double[][] inputTraining, outputTraining; Triplet.Transform2IO(trainingSet, out inputTraining, out outputTraining); //Generate the test data List <Triplet> testSet = GenerateDESDataset(trainingSetSize, keySize, messageSize); double[][] inputTest, outputTest; Triplet.Transform2IO(testSet, out inputTest, out outputTest); //Find the right sizes, not sure why I have to do that :-/ int inputSize = trainingSet.First().original.Count() + trainingSet.First().encrypted.Count(); int outputSize = trainingSet.First().key.Count(); //Create a network var function = new SigmoidFunction(2.0); //ActivationNetwork network = new ActivationNetwork(function, inputSize, 25, outputSize); //ParallelResilientBackpropagationLearning teacher = new ParallelResilientBackpropagationLearning(network); DeepBeliefNetwork network = new DeepBeliefNetwork(inputSize, 10, outputSize); Accord.Neuro.Learning.DeepNeuralNetworkLearning teacher = new DeepNeuralNetworkLearning(network); //Train the network int epoch = 0; double stopError = 0.1; int resets = 0; double minimumErrorReached = double.PositiveInfinity; while (minimumErrorReached > stopError && resets < 1) { network.Randomize(); //teacher.Reset(0.0125); double errorTrain = double.PositiveInfinity; for (epoch = 0; epoch < 500000 && errorTrain > stopError; epoch++) { errorTrain = teacher.RunEpoch(inputTraining, outputTraining) / (double)trainingSetSize; //Console.WriteLine("Epoch " + epoch + " = \t" + error); if (errorTrain < minimumErrorReached) { minimumErrorReached = errorTrain; network.Save("cryptoDESNetwork.mlp"); } Console.Clear(); Console.WriteLine("Epoch : " + epoch); Console.WriteLine("Train Set Error : " + errorTrain.ToString("N2")); double errorTest = teacher.ComputeError(inputTest, outputTest) / (double)inputTest.Count(); Console.WriteLine("Test Set Error : " + errorTest.ToString("N2")); } //Console.Write("Reset (" + error+")->"); resets++; } Console.WriteLine(); //Compute the reall error foreach (Triplet tReal in testSet) { double[] rIn, rOut, pOut; byte[] brMsg, brEncrypted, brKey; tReal.ToBytes(out brMsg, out brEncrypted, out brKey); tReal.ToIO(out rIn, out rOut); pOut = network.Compute(rIn); Triplet tPredicted = new Triplet(rIn, pOut, messageSize); byte[] bpMsg, bpEncrypted, bpKey; tPredicted.ToBytes(out bpMsg, out bpEncrypted, out bpKey); int wrongBytes = 0; for (int i = 0; i < keySize / 8; i++) { if (brKey[i] != bpKey[i]) { wrongBytes++; } } Console.WriteLine("Wrong bytes = " + wrongBytes); //Console.WriteLine("REAL = \n" + tReal.GetBytesForm()); //Console.WriteLine("Predicted = \n" + tPredicted.GetBytesForm()); } Console.ReadKey(); }