public void BuildsANetworkWith784InputNeurons10OutputNeuronsAndTheRequestedHiddenLayerSize()
        {
            var net = MnistLearnerSigmoidNetBuilder.Build(15);

            net.Net.InputLayer.Length.ShouldBe(Image.ByteSize);
            net.Net.HiddenLayer.Length.ShouldBe(15);
            net.Net.OutputLayer.Length.ShouldBe(10);
        }
        public void BuildsANetworkWithReverseInterpretationBeingTheInverseOfTheInterpretation()
        {
            var net = MnistLearnerSigmoidNetBuilder.Build(15);
            //
            var digitsAsOutputNeurons =
                Enumerable.Range(0, 10)
                .Select(i => Enumerable.Range(0, 10).Select(j => j == i ? new ZeroToOne(1) : new ZeroToOne(0))).ToArray();

            for (byte i = 0; i < 10; i++)
            {
                net.ReverseInterpretation(i).ShouldEqualByValue(digitsAsOutputNeurons[i]);
            }
        }
        public void IsTrainableByBackPropagation()
        {
            var net                 = MnistLearnerSigmoidNetBuilder.Build(15);
            var trainingData        = new MnistFilesReader(mnistRealDataDirectory).TrainingData.Take(200).Select(p => new LearningNeuralNetworks.V1.Pair <Image, byte>(p.Data, p.Label)).ToArray();
            var scoreBeforeTraining = HitsScoredOnTestData(net, trainingData);

            //
            new BackPropagationWithGradientDescent().ApplyToBatches(net, trainingData, 10, 3, 100);
            //
            var scoreAfterTraining = HitsScoredOnTestData(net, trainingData);

            Console.WriteLine("Scores before/after training: {0} / {1}", scoreBeforeTraining, scoreAfterTraining);
            scoreAfterTraining.ShouldBeGreaterThan(scoreBeforeTraining);
        }
        public void BuildsANetworkWithInterpretationOfOutputLayerAsADigit()
        {
            var net = MnistLearnerSigmoidNetBuilder.Build(15);

            net.OutputFor(new[] { 1d }).ShouldBeOfType <byte>();
            //
            var digitsAsOutputNeurons =
                Enumerable.Range(0, 10)
                .Select(i => Enumerable.Range(0, 10).Select(j => j == i ? new ZeroToOne(1) : new ZeroToOne(0))).ToArray();

            digitsAsOutputNeurons[0].ShouldEqualByValue(new ZeroToOne[] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 });
            digitsAsOutputNeurons[1].ShouldEqualByValue(new ZeroToOne[] { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 });
            digitsAsOutputNeurons[4].ShouldEqualByValue(new ZeroToOne[] { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 });
            digitsAsOutputNeurons[5].ShouldEqualByValue(new ZeroToOne[] { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 });
            digitsAsOutputNeurons[9].ShouldEqualByValue(new ZeroToOne[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 });
        }