Ejemplo n.º 1
0
Archivo: SandBox.cs Proyecto: shchy/dl
        public void Run()
        {
            // 入力レイヤ
            var inputLayer = new InputLayer(3);
            // 隠れレイヤ
            var layer00 = new FullyConnectedLayer(inputLayer, 20, DLF.ReLU, DLF.UpdateWeight(), DLF.GetRandomWeight);
            // 隠れレイヤ
            var layer01 = new FullyConnectedLayer(layer00, 10, DLF.ReLU, DLF.UpdateWeight(), DLF.GetRandomWeight);
            // 出力レイヤ
            var layer02 = new SoftmaxLayer(layer01, 3);

            var batchSize    = 8;
            var epoch        = 1000;
            var learningRate = 0.01;
            Func <IEnumerable <Tuple <double, double> >, double> errorFunction = DLF.ErrorFunctionCrossEntropy;

            var machine = new Machine(learningRate, epoch, batchSize, new Validator(3)
                                      , x => errorFunction(x) * (1.0 / batchSize)
                                      , inputLayer
                                      , layer00
                                      , layer01
                                      , layer02);
            // 学習データを生成
            var testData = DLF.Shuffle(
                from x in Enumerable.Range(1, 8)
                from y in Enumerable.Range(1, 8)
                from z in Enumerable.Range(1, 8)
                let v = x + (y * 2) + z
                        let expect = v < 15 ? new[] { 1.0, 0.0, 0.0 }
                        : v < 20 ? new[] { 0.0, 1.0, 0.0 }
                        : new[] { 0.0, 0.0, 1.0 }
                select LearningData.New(expect.ToString(), new double[] { x, y, z }, expect))
                           .ToArray();

            var validData = testData.Skip(testData.Length / 2).ToArray();

            testData = testData.Take(testData.Length / 2).ToArray();

            machine.Learn(testData.ToArray(), validData.ToArray());
        }
Ejemplo n.º 2
0
        public void Run()
        {
            var batchSize    = 10;
            var epoch        = 50;
            var learningRate = 0.005;
            var outputSize   = 10;
            // 入力レイヤ
            var inputLayer = new InputLayer(28, 28);
            // 畳み込みレイヤ
            // プーリングレイヤ
            var layer00 = new ConvolutionLayer(inputLayer, (3, 1, 20), DLF.ReLU, u => u < 0);
            var layer01 = new PoolingLayer(layer00, (2, 2));
            // 畳み込みレイヤ
            // プーリングレイヤ
            var layer02 = new ConvolutionLayer(layer01, (3, 2, 50), DLF.ReLU, u => u < 0);
            var layer03 = new PoolingLayer(layer02, (2, 2));
            // 出力レイヤ
            var layer04 = new SoftmaxLayer(layer03, outputSize);

            Func <IEnumerable <Tuple <double, double> >, double> errorFunction = DLF.ErrorFunctionCrossEntropy;

            var machine = new Machine(learningRate, epoch, batchSize, new Validator(outputSize)
                                      , x => errorFunction(x) * (1.0 / batchSize)
                                      , inputLayer
                                      , layer00
                                      , layer01
                                      , layer02
                                      , layer03
                                      , layer04);
            // 学習データを生成
            var testData = DLF.Shuffle(new MNISTLoader().Load()).ToArray();

            // 0-9を均等にピックアップ
            var pickNum = 20;
            var a       = new[] {
                testData.Take(10000).Where(x => x.Name == "0").Take(pickNum),
                testData.Take(10000).Where(x => x.Name == "1").Take(pickNum),
                testData.Take(10000).Where(x => x.Name == "2").Take(pickNum),
                testData.Take(10000).Where(x => x.Name == "3").Take(pickNum),
                testData.Take(10000).Where(x => x.Name == "4").Take(pickNum),
                testData.Take(10000).Where(x => x.Name == "5").Take(pickNum),
                testData.Take(10000).Where(x => x.Name == "6").Take(pickNum),
                testData.Take(10000).Where(x => x.Name == "7").Take(pickNum),
                testData.Take(10000).Where(x => x.Name == "8").Take(pickNum),
                testData.Take(10000).Where(x => x.Name == "9").Take(pickNum),
            }.SelectMany(x => x).ToArray();
            var b = new[] {
                testData.Skip(10000).Where(x => x.Name == "0").Take(pickNum),
                testData.Skip(10000).Where(x => x.Name == "1").Take(pickNum),
                testData.Skip(10000).Where(x => x.Name == "2").Take(pickNum),
                testData.Skip(10000).Where(x => x.Name == "3").Take(pickNum),
                testData.Skip(10000).Where(x => x.Name == "4").Take(pickNum),
                testData.Skip(10000).Where(x => x.Name == "5").Take(pickNum),
                testData.Skip(10000).Where(x => x.Name == "6").Take(pickNum),
                testData.Skip(10000).Where(x => x.Name == "7").Take(pickNum),
                testData.Skip(10000).Where(x => x.Name == "8").Take(pickNum),
                testData.Skip(10000).Where(x => x.Name == "9").Take(pickNum),
            }.SelectMany(x => x).ToArray();

            machine.Learn(a, b);
        }