Пример #1
0
        public FormMain()
        {
            InitializeComponent();

            //GPUを初期化
            Weaver.Initialize(ComputeDeviceTypes.Gpu);
        }
Пример #2
0
        public void Conv2DGPURandomTest()
        {
            Weaver.Initialize();

            if (Weaver.Enable)
            {
                RandomTest(true);
            }
            else
            {
                Assert.Inconclusive();
            }
        }
Пример #3
0
        static void Main(string[] args)
        {
            //全て.Net Framework上で実行したい場合はこちらをコメントアウト
            Weaver.Initialize(ComputeDeviceTypes.Gpu);
            //Weaver.Initialize(ComputeDeviceTypes.Cpu, 1); //複数デバイスがある場合は添字が必要

            //MLPによるXORの学習
            Test1.Run();

            //MLPによるXORの学習【回帰版】
            //Test2.Run();

            //MLPによるSin関数の学習
            //Test3.Run();

            //MLPによるMNIST(手書き文字)の学習
            //Test4.Run();

            //エクセルCNNの再現
            //Test5.Run();

            //5層CNNによるMNISTの学習
            //Test6.Run();

            //BatchNormを使った15層MLPによるMNISTの学習
            //Test7.Run();

            //LSTMによるSin関数の学習
            //Test8.Run();

            //SimpleなRNNによるRNNLM
            //Test9.Run();

            //LSTMによるRNNLM
            //Test10.Run();

            //Decoupled Neural Interfaces using Synthetic GradientsによるMNISTの学習
            //Test11.Run();

            //Test11のDNIをcDNIとした
            //Test12.Run();

            //Deconvolution2Dのテスト(Winform)
            //new Test13WinForm().ShowDialog();

            //Test6を連結して実行
            //Test14.Run();

            //CaffeモデルのVGG16を読み込んで画像分類をさせるテスト
            //Test15.Run();

            //ChainerモデルのTest5と同じ内容を読み込んで実行
            //Test16.Run();

            //CaffeモデルのRESNETを読み込んで画像分類をさせるテスト
            //Test17.Run(Test17.ResnetModel.ResNet50);  //任意のResnetモデルを選択してください

            //CIFAR-10を5層CNNを使って学習する
            //Test18.Run(isCifar100:false, isFineLabel:false);

            //CaffeモデルのAlexNetを読み込んで画像分類をさせるテスト
            //Test19.Run();

            //Linearの分割実行
            //TestX.Run();

            //ベンチマーク
            SingleBenchmark.Run();

            Console.WriteLine("Test Done...");
            Console.Read();
        }
Пример #4
0
        static void Main(string[] args)
        {
            //全て.Net Framework上で実行したい場合はこちらをコメントアウト
            Weaver.Initialize();
            //Weaver.Initialize(ComputeDeviceTypes.Cpu); //複数の種類のデバイスがある場合はデバイスタイプを指定
            //Weaver.Initialize(ComputeDeviceTypes.Gpu, 1); //同じ種類のGPUやCPUが複数ある場合は添字を使用

            Console.WriteLine("Running on " + Weaver.InfoString);

            //MLPによるXORの学習
            //Sample01.Run();

            //MLPによるXORの学習【回帰版】
            //Sample02.Run();

            //MLPによるSin関数の学習
            //Sample03.Run();

            //MLPによるMNIST(手書き文字)の学習
            //Sample04.Run();

            //エクセルCNNの再現
            //Sample05.Run();

            //5層CNNによるMNISTの学習
            //Sample06.Run();

            //BatchNormを使った15層MLPによるMNISTの学習
            //Sample07.Run();

            //LSTMによるSin関数の学習
            //Sample08.Run();

            //SimpleなRNNによるRNNLM
            //Sample09.Run();

            //LSTMによるRNNLM
            //Sample10.Run();

            //Decoupled Neural Interfaces using Synthetic GradientsによるMNISTの学習
            //Sample11.Run();

            //Test11のDNIをcDNIとした
            //Sample12.Run();

            //Deconvolution2Dのテスト(Winform)
            //new Sample13WinForm().ShowDialog();

            //Test6を連結して実行
            //Sample14.Run();

            //CaffeモデルのVGGを読み込んで画像分類をさせるテスト
            //Sample15.Run(Sample15.VGGModel.VGG16); //VGG16またはVGG19を選択してください

            //ChainerモデルのTest5と同じ内容を読み込んで実行
            //Sample16.Run();

            //CaffeモデルのRESNETを読み込んで画像分類をさせるテスト
            //Sample17.Run(Sample17.ResnetModel.ResNet50);  //任意のResnetモデルを選択してください

            //CIFAR-10を5層CNNを使って学習する
            //Sample18.Run(isCifar100:false, isFineLabel:false);

            //CaffeモデルのAlexNetを読み込んで画像分類をさせるテスト
            //Sample19.Run();

            //Linearの分割実行
            //SampleX.Run();

            //ベンチマーク
            SingleBenchmark.Run();

            Console.WriteLine("Done...");
            Console.Read();
        }
Пример #5
0
        static void Main(string[] args)
        {
            //Comment out here if you want to run on..NET Framework
            Weaver.Initialize(ComputeDeviceTypes.Gpu);
            //Weaver.Initialize (ComputeDeviceTypes.Cpu, 1);
            //Subscript required if there are multiple devices

            //learning XOR with MLP
            //Test1.Run ();

            //Learning XOR with MLP (Regression version)
            //Test2.Run ();

            //Learning of Sin function by MLP
            //Test3.Run ();

            //Learning of MNIST (handwritten character) by MLP
            //Test4.Run ();

            //Reproduction of Excel CNN
            //Test 5. Run ();

            //Learning of MNIST with 5 - layer CNN
            //Test6.Run ();

            //Learning of MNIST by 15 layer MLP using BatchNorm
            //Test7.Run ();

            //Learning of Sin function by LSTM
            //Test8.Run ();

            //RNNLM with a simple RNN
            //Test9.Run ();

            //RNNLM by LSTM
            //Test10.Run ();

            //MNIST learning by Decoupled Neural Interfaces using Synthetic Gradients
            //Test11.Run ();

            //Set DNI of Test 11 as cDNI
            //Test12.Run ();

            //Test of Deconvolution 2D (Winform)
            //new Test 13 WinForm (). ShowDialog ();

            //Connect Test 6 and execute
            //Test14.Run ();

            //Test that reads VGG 16 of Caffe model and makes image classification
            //Test15.Run ();

            //Load the same contents as Test 5 of Chainer model and execute it
            //Test16.Run ();

            //Test to load image classification by loading RESNET of Caffe model
            //Test17.Run(Test17.ResnetModel.ResNet50);
            //Please choose an arbitrary Resnet model

            //CIFAR-10を5層CNNを使って学習する
            //Test18.Run();

            //Linearの分割実行
            //TestX.Run();

            //benchmark
            SingleBenchmark.Run();

            Console.WriteLine("Test Done ...");
            Console.Read();
        }
Пример #6
0
        public static void Main(string[] args)
        {
            //Cifar-10のデータを用意する
            Console.WriteLine("CIFAR Data Loading...");
            CifarData cifarData = new CifarData();

            //platformIdは、OpenCL・GPUの導入の記事に書いてある方法でご確認ください
            Weaver.Initialize(ComputeDeviceTypes.Gpu, platformId: 1, deviceIndex: 0);

            //ネットワークの構成を FunctionStack に書き連ねる
            FunctionStack nn = new FunctionStack(

                /* 最初の4層の畳み込み層を削除
                 * new Convolution2D (3, 64, 3, pad: 1, gpuEnable: true),
                 * new ReLU (),
                 * new Convolution2D (64, 64, 3, pad: 1, gpuEnable: true),
                 * new ReLU (),
                 * new MaxPooling(2, 2, gpuEnable: true),
                 *
                 * new Convolution2D (64, 128, 3, pad: 1, gpuEnable: true),
                 * new ReLU (),
                 * new Convolution2D (128, 128, 3, pad: 1, gpuEnable: true),
                 * new ReLU (),
                 * new MaxPooling(2, 2, gpuEnable: true),
                 */

                // (3, 32, 32)
                new Convolution2D(3, 64, 3, pad: 1, gpuEnable: true),
                new ReLU(),
                new Convolution2D(64, 64, 3, pad: 1, gpuEnable: true),
                new ReLU(),
                new Convolution2D(64, 64, 3, pad: 1, gpuEnable: true),
                new ReLU(),
                new MaxPooling(2, 2, gpuEnable: true),

                // (64, 16, 16)
                new Convolution2D(64, 128, 3, pad: 1, gpuEnable: true),
                new ReLU(),
                new Convolution2D(128, 128, 3, pad: 1, gpuEnable: true),
                new ReLU(),
                new Convolution2D(128, 128, 3, pad: 1, gpuEnable: true),
                new ReLU(),
                new MaxPooling(2, 2, gpuEnable: true),

                // (128, 8, 8)
                new Convolution2D(128, 128, 3, pad: 1, gpuEnable: true),
                new ReLU(),
                new Convolution2D(128, 128, 3, pad: 1, gpuEnable: true),
                new ReLU(),
                new Convolution2D(128, 128, 3, pad: 1, gpuEnable: true),
                new ReLU(),
                new MaxPooling(2, 2, gpuEnable: true),

                // (128, 4, 4)
                new Linear(128 * 4 * 4, 1024, gpuEnable: true),
                new ReLU(),
                new Dropout(0.5),
                new Linear(1024, 1024, gpuEnable: true),
                new ReLU(),
                new Dropout(0.5),
                new Linear(1024, 10, gpuEnable: true)
                );

            //optimizerを宣言
            nn.SetOptimizer(new Adam());

            Console.WriteLine("Training Start...");

            // epoch
            for (int epoch = 1; epoch < 10; epoch++)
            {
                Console.WriteLine("\nepoch " + epoch);

                //全体での誤差を集計
                Real totalLoss      = 0;
                long totalLossCount = 0;

                //何回バッチを実行するか
                for (int i = 1; i < TRAIN_DATA_COUNT + 1; i++)
                {
                    //Console.WriteLine ("\nbatch count " + i + "/" + TRAIN_DATA_COUNT);

                    //訓練データからランダムにデータを取得
                    TestDataSet datasetX = cifarData.GetRandomXSet(BATCH_DATA_COUNT);

                    //バッチ学習を並列実行する
                    Real sumLoss = Trainer.Train(nn, datasetX.Data, datasetX.Label, new SoftmaxCrossEntropy());

                    totalLoss += sumLoss;
                    totalLossCount++;

                    //結果出力
                    Console.WriteLine("total loss " + totalLoss / totalLossCount);
                    Console.WriteLine("local loss " + sumLoss);

                    //50回バッチを動かしたら精度をテストする
                    if (i % 50 == 0)
                    {
                        Console.WriteLine("step: " + i + " Testing...");

                        //テストデータからランダムにデータを取得
                        TestDataSet datasetY = cifarData.GetRandomYSet(TEACH_DATA_COUNT);

                        //テストを実行
                        Real accuracy = Trainer.Accuracy(nn, datasetY.Data, datasetY.Label);
                        Console.WriteLine("accuracy " + accuracy);
                    }
                }
            }
        }
Пример #7
0
        static void Main(string[] args)
        {
            //Comment out here if you want to run all on .Net Framework
            Weaver.Initialize(ComputeDeviceTypes.Cpu);
            //Weaver.Initialize(ComputeDeviceTypes.Cpu, 1); //Subscript required if there are multiple devices

            //Learning XOR with MLP
            //Test1.Run();

            //Learning XOR with MLP 【Returned version】
            //Test2.Run();

            //Learning of Sin function by MLP
            //Test3.Run();

            //Learning of MNIST (Handwritten Characters) by MLP
            //Test4.Run();

            //Reproduction of Excel CNN
            //Test5.Run();

            //Learning of MNIST by 5-layer CNN
            //Test6.Run();

            //Learning of MNIST by 15-tier MLP using BatchNorm
            //Test7.Run();

            //Learning of Sin function by LSTM
            //Test8.Run();

            //RNNLM with Simple RNN
            //Test9.Run();

            //RNNLM by LSTM
            //Test10.Run();

            //Decoupled Neural Interfaces using Synthetic Gradients by learning MNIST
            //Test11.Run();

            //DNI of Test 11 was defined as cDNI
            //Test12.Run();

            //Test of Deconvolution 2D(Winform)
            //new Test13WinForm().ShowDialog();

            //Concatenate Test 6 and execute
            //Test14.Run();

            //Test to read VGA 16 of Caffe model and classify images
            //Test15.Run();

            //Load and execute the same content as Test 5 of Chainer model
            //Test16.Run();

            //Test that reads RESNET of Caffe model and classifies images
            //Test17.Run(Test17.ResnetModel.ResNet50);  //Please select any Resnet model

            //Learn CIFAR-10 with 5-layer CNN
            //Test18.Run();

            //Partial execution of Linear
            //TestX.Run();

            // LeakyReLu and PolynomialApproximantSteep combination network
            //Test19.Run();

            // 1000 layer neural network
            Test20.Run();

            //benchmark
            //SingleBenchmark.Run();

            Console.WriteLine("Test Done...");
            Console.Read();
        }
    public static void Main()
    {
        // platformIdは、OpenCL・GPUの導入の記事に書いてある方法でご確認ください
        // https://jinbeizame.hateblo.jp/entry/kelpnet_opencl_gpu
        Weaver.Initialize(ComputeDeviceTypes.Gpu, platformId: 1, deviceIndex: 0);

        // ネットからVGGの学習済みモデルをダウンロード
        string modelFilePath = InternetFileDownloader.Donwload(DOWNLOAD_URL, MODEL_FILE);
        // 学習済みモデルをFunctionのリストとして保存
        List <Function> vgg16Net = CaffemodelDataLoader.ModelLoad(modelFilePath);

        // VGGの出力層とその活性化関数を削除
        vgg16Net.RemoveAt(vgg16Net.Count() - 1);
        vgg16Net.RemoveAt(vgg16Net.Count() - 1);

        // VGGの各FunctionのgpuEnableをtrueに
        for (int i = 0; i < vgg16Net.Count - 1; i++)
        {
            // GPUに対応している層であれば、GPU対応へ
            if (vgg16Net[i] is Convolution2D || vgg16Net[i] is Linear || vgg16Net[i] is MaxPooling)
            {
                ((IParallelizable)vgg16Net[i]).SetGpuEnable(true);
            }
        }

        // VGGをリストからFunctionStackに変換
        FunctionStack vgg = new FunctionStack(vgg16Net.ToArray());

        // 層を圧縮
        vgg.Compress();

        // 新しく出力層とその活性化関数を用意
        FunctionStack nn = new FunctionStack(
            new Linear(4096, 1, gpuEnable: true),
            new Sigmoid()
            );

        // 最適化手法としてAdamをセット
        nn.SetOptimizer(new Adam());

        Console.WriteLine("DataSet Loading...");

        // 訓練・テストデータ用のNdArrayを用意
        // データセットは以下のURLからダウンロードを行い、
        // VGGTransfer /bin/Debug/Data にtrainフォルダを置いてください。
        // https://www.kaggle.com/c/dogs-vs-cats/data
        NdArray[] trainData  = new NdArray[TRAIN_DATA_LENGTH * 2];
        NdArray[] trainLabel = new NdArray[TRAIN_DATA_LENGTH * 2];
        NdArray[] testData   = new NdArray[TEST_DATA_LENGTH * 2];
        NdArray[] testLabel  = new NdArray[TEST_DATA_LENGTH * 2];

        for (int i = 0; i < TRAIN_DATA_LENGTH + TEST_DATA_LENGTH; i++)
        {
            // 犬・猫の画像読み込み
            Bitmap baseCatImage = new Bitmap("Data/train/cat." + i + ".jpg");
            Bitmap baseDogImage = new Bitmap("Data/train/dog." + i + ".jpg");
            // 変換後の画像を格納するBitmapを定義
            Bitmap catImage = new Bitmap(224, 224, PixelFormat.Format24bppRgb);
            Bitmap dogImage = new Bitmap(224, 224, PixelFormat.Format24bppRgb);
            // Graphicsオブジェクトに変換
            Graphics gCat = Graphics.FromImage(catImage);
            Graphics gDog = Graphics.FromImage(dogImage);
            // Graphicsオブジェクト(の中のcatImageに)baseImageを変換して描画
            gCat.DrawImage(baseCatImage, 0, 0, 224, 224);
            gDog.DrawImage(baseDogImage, 0, 0, 224, 224);
            // Graphicsオブジェクトを破棄し、メモリを解放
            gCat.Dispose();
            gDog.Dispose();

            // 訓練・テストデータにデータを格納
            // 先にテストデータの枚数分テストデータに保存し、その後訓練データを保存する
            // 画素値の値域は0 ~ 255のため、255で割ることで0 ~ 1に正規化
            if (i < TEST_DATA_LENGTH)
            {
                // ImageをNdArrayに変換したものをvggに入力し、出力した特徴量を入力データとして保存
                testData[i * 2]      = vgg.Predict(NdArrayConverter.Image2NdArray(catImage, false, true) / 255.0)[0];
                testLabel[i * 2]     = new NdArray(new Real[] { 0 });
                testData[i * 2 + 1]  = vgg.Predict(NdArrayConverter.Image2NdArray(dogImage, false, true) / 255.0)[0];
                testLabel[i * 2 + 1] = new NdArray(new Real[] { 1 });
            }
            else
            {
                trainData[(i - TEST_DATA_LENGTH) * 2]  = vgg.Predict(NdArrayConverter.Image2NdArray(catImage, false, true) / 255.0)[0];
                trainLabel[(i - TEST_DATA_LENGTH) * 2] = new NdArray(new Real[] { 0 }); //new Real [] { 0 };
                trainData[(i - TEST_DATA_LENGTH) * 2]  = vgg.Predict(NdArrayConverter.Image2NdArray(dogImage, false, true) / 255.0)[0];
                trainLabel[(i - TEST_DATA_LENGTH) * 2] = new NdArray(new Real[] { 1 }); // = new Real [] { 1 };
            }
        }

        Console.WriteLine("Training Start...");

        // ミニバッチ用のNdArrayを定義
        NdArray batchData  = new NdArray(new[] { 4096 }, BATCH_SIZE);
        NdArray batchLabel = new NdArray(new[] { 1 }, BATCH_SIZE);

        // 誤差関数を定義(今回は二値分類なので二乗誤差関数(MSE))
        LossFunction lossFunction = new MeanSquaredError();

        // エポックを回す
        for (int epoch = 0; epoch < 10; epoch++)
        {
            // 1エポックで訓練データ // バッチサイズ の回数分学習
            for (int step = 0; step < TRAIN_DATA_COUNT; step++)
            {
                // ミニバッチを用意
                for (int i = 0; i < BATCH_SIZE; i++)
                {
                    // 0 ~ 訓練データサイズ-1 の中からランダムで整数を取得
                    int index = Mother.Dice.Next(trainData.Length);
                    // trainData(NdArray[])を、batchData(NdArray)の形にコピー
                    Array.Copy(trainData[index].Data, 0, batchData.Data, i * batchData.Length, batchData.Length);
                    batchLabel.Data[i] = trainLabel[index].Data[0];
                }

                // 学習(順伝播、誤差の計算、逆伝播、更新)
                NdArray[] output = nn.Forward(batchData);
                Real      loss   = lossFunction.Evaluate(output, batchLabel);
                nn.Backward(output);
                nn.Update();
            }

            // 認識率(accuracy)の計算
            // テストデータの回数データを回す
            Real accuracy = 0;
            for (int i = 0; i < TEST_DATA_LENGTH * 2; i++)
            {
                NdArray[] output = nn.Predict(testData[i]);
                // 出力outputと正解の誤差が0.5以下(正解が0のときにoutput<0.5、正解が1のときにoutput>0.5)
                // の際に正確に認識したとする
                if (Math.Abs(output[0].Data[0] - trainLabel[i].Data[0]) < 0.5)
                {
                    accuracy += 1;
                }
                accuracy /= TEST_DATA_LENGTH * 2.0;
                Console.WriteLine("Epoch:" + epoch + "accuracy:" + accuracy);
            }
        }
    }