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()); }
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); }