NeuralNetwork.netは、C#でゼロから構築されたカスタマイズ可能なレイヤーを使用して、シーケンシャルおよび計算グラフニューラルネットワークを実装する.NET標準2.0ライブラリです。確率的勾配降下を使用してモデルを定義およびトレーニングするための迅速なプロトタイピング用に設計された単純なAPIと、ネットワークモデルとそのメタデータなどを保存/ロードする方法を提供します。ライブラリはまた、GPUとCUDNNツールキットを活用するより高度な機能を備えたCUDAアクセラレーションレイヤーを公開し、トレーニングまたはニューラルネットワークの使用時にパフォーマンスを大幅に向上させます。
免責事項:このライブラリはそのまま提供されており、積極的に維持されなくなりました。 NeuralNetwork.netは大学のコース中に開発されましたが、他の有名な機械学習フレームワークに代わるものではありません。 .NETが生産で使用する機械学習ライブラリを探している場合は、ML.NETまたはTensorflow.netを試すことをお勧めします。
neuralnetwork.netをインストールするには、パッケージマネージャーコンソールで次のコマンドを実行します
Install-Package NeuralNetwork.NET
詳細はこちらをご覧ください。
NeuralNetwork.netライブラリは、簡単に使用できるクラスと方法を公開して、新しいニューラルネットワークを作成し、データセットを準備してネットワークを使用してトレーニングします。これらのAPIは、迅速なプロトタイピング用に設計されており、このセクションでは、開始するために必要な手順の概要を説明します。
最初のステップは、カスタムネットワーク構造を作成することです。以下は、シーケンシャルネットワーク(レイヤーのスタック)を備えた例です。
INeuralNetwork network = NetworkManager . NewSequential ( TensorInfo . Image < Alpha8 > ( 28 , 28 ) ,
NetworkLayers . Convolutional ( ( 5 , 5 ) , 20 , ActivationType . Identity ) ,
NetworkLayers . Pooling ( ActivationType . LeakyReLU ) ,
NetworkLayers . Convolutional ( ( 3 , 3 ) , 40 , ActivationType . Identity ) ,
NetworkLayers . Pooling ( ActivationType . LeakyReLU ) ,
NetworkLayers . FullyConnected ( 125 , ActivationType . LeakyReLU ) ,
NetworkLayers . FullyConnected ( 64 , ActivationType . LeakyReLU ) ,
NetworkLayers . Softmax ( 10 ) ) ;
次のステップは、 DatasetLoader
クラスのAPIを介して使用するデータセットを準備することです。
// A training dataset with a batch size of 100
IEnumerable < ( float [ ] x , float [ ] u ) > data = .. . // Your own dataset parsing routine
ITrainingDataset dataset = DatasetLoader . Training ( data , 100 ) ;
// An optional test dataset with a callback to monitor the progress
ITestDataset test = DatasetLoader . Test ( .. . , p =>
{
Console . WriteLine ( $" Epoch { p . Iteration } , cost: { p . Cost } , accuracy: { p . Accuracy } " ) ; // Progress report
} ) ;
ニューラルネットワークのトレーニングは非常に簡単です - NetworkManager
クラスでメソッドを使用するだけです。
// Train the network using Adadelta and 0.5 dropout probability
TrainingSessionResult result = NetworkManager . TrainNetwork (
network , // The network instance to train
dataset , // The ITrainingDataset instance
TrainingAlgorithms . AdaDelta ( ) , // The training algorithm to use
60 , // The expected number of training epochs to run
0.5f , // Dropout probability
p => .. . , // Optional training epoch progress callback
null , // Optional callback to monitor the training dataset accuracy
null , // Optional validation dataset
test , // Test dataset
token ) ; // Cancellation token for the training
注: NetworkManager
メソッドは、非同期APIとしても利用できます。
サポートされているフレームワーク(.NETフレームワーク、XamarinまたはMono)で実行する場合、CUDNNツールキットを活用し、利用可能なCUDA対応GPUの作業のほとんどを並列化する利用可能なレイヤーの異なる実装を使用することができます。それを行うには、ネットワークを作成するときにCuDnnNetworkLayers
クラスのレイヤーを使用してください。
Cudnn駆動のレイヤーの一部は、デフォルトのレイヤーよりも追加のオプションをサポートしています。これが例です:
// A cuDNN convolutional layer, with custom mode, padding and stride
LayerFactory convolutional = CuDnnNetworkLayers . Convolutional (
ConvolutionInfo . New ( ConvolutionMode . CrossCorrelation , 3 , 3 , 2 , 2 ) ,
( 7 , 7 ) , 20 , ActivationType . ReLU ) ;
// An inception module, from the design of the GoogLeNet network
LayerFactory inception = CuDnnNetworkLayers . Inception ( InceptionInfo . New (
10 , // 1x1 convolution kernels
20 , 10 , // 1x1 + 3x3 convolution pipeline kernels
20 , 10 , // 1x1 + 5x5 convolution pipeline kernels
PoolingMode . AverageExcludingPadding , 10 ) ) ; // Pooling mode and 1x1 convolution kernels
これらのLayerFactory
インスタンスを使用して、CPUの例のように新しいネットワークを作成できます。
注:この機能を使用するには、CUDAおよびCUDNNツールキットを現在のシステムにインストールする必要があります。CUDA対応NVIDIA GeForce/Quadro GPUが利用可能でなければならず、 ALEA NUGETパッケージはNeuralNetwork.netを使用してアプリケーションにインストールする必要があります。ライブラリも。追加情報はこちらからご覧いただけます。
残差ネットワークやインセプションモジュールなどの複雑なネットワーク構造は、単純なシーケンシャルネットワーク構造として表現することはできません。これは、計算グラフネットワークが登場する場所です。レイヤーの線形スタックを介して入力を転送する代わりに、計算グラフには、異なるノードを接続できる特定の空間構造があります。たとえば、グラフで後でマージされたさまざまな並列パイプラインを介してデータをチャネルすること、またはトレーニングフェーズ中の勾配バックプロパゲーションに寄与する補助分類器を持つことができます。
計算グラフネットワークは、 NetworkManager.NewGraph
APIを使用して作成されます。例は次のとおりです。
INeuralNetwork network = NetworkManager . NewGraph ( TensorInfo . Image < Rgb24 > ( 32 , 32 ) , root =>
{
var conv1 = root . Layer ( CuDnnNetworkLayers . Convolutional ( ( 5 , 5 ) , 20 , ActivationType . Identity ) ) ;
var pool1 = conv1 . Layer ( CuDnnNetworkLayers . Pooling ( ActivationType . ReLU ) ) ;
var conv2 = pool1 . Pipeline (
CuDnnNetworkLayers . Convolutional ( ( 1 , 1 ) , 20 , ActivationType . ReLU ) ,
CuDnnNetworkLayers . Convolutional ( ConvolutionInfo . Same ( ) , ( 5 , 5 ) , 40 , ActivationType . ReLU ) ,
CuDnnNetworkLayers . Convolutional ( ( 1 , 1 ) , 20 , ActivationType . ReLU ) ) ;
var sum = conv2 + pool1 ;
var fc1 = sum . Layer ( CuDnnNetworkLayers . FullyConnected ( 250 , ActivationType . LeCunTanh ) ) ;
var fc2 = fc1 . Layer ( CuDnnNetworkLayers . FullyConnected ( 125 , ActivationType . LeCunTanh ) ) ;
_ = fc2 . Layer ( CuDnnNetworkLayers . Softmax ( 10 ) ) ;
} ) ;
NeuralNetwork.netは、 NetworkSettings
クラスで利用できるさまざまな共有設定を提供します。このクラスは、いつでも設定を迅速にチェックおよび変更するコンテナとして機能し、これらの設定は、既存のINeuralNetwork
インスタンスとライブラリ全般の動作に影響を与えます。
たとえば、ネットワークが使用する基準をカスタマイズしてトレーニング中にパフォーマンスを確認することができます
NetworkSettings . AccuracyTester = AccuracyTesters . Argmax ( ) ; // The default mode (mutually-exclusive classes)
// Other testers are available too
NetworkSettings . AccuracyTester = AccuracyTesters . Threshold ( ) ; // Useful for overlapping classes
NetworkSettings . AccuracyTester = AccuracyTesters . Distance ( 0.2f ) ; // Distance between results and expected outputs
CUDAを搭載したネットワークを使用する場合、使用中のGPUが単一のパスでテストまたは検証データセット全体を処理できない場合があります。これはデフォルトの動作です(これらのデータセットはバッチに分割されません)。メモリの問題を回避するために、この動作を変更することが可能です。
NetworkSettings . MaximumBatchSize = 400 ; // This will apply to any test or validation dataset
INeuralNetwork
インターフェイスは、いつでも任意のネットワークをシリアル化するために使用できるSave
方法を公開します。保存されたファイルまたはストリームから新しいネットワークインスタンスを取得するには、 NetworkLoader.TryLoad
メソッドを使用してください。
複数のレイヤータイプには、利用可能なライブラリ全体で異なる実装があるため、保存されたネットワークをロードするときに使用するレイヤープロバイダーを指定できます。たとえば、CUDNNレイヤーを使用してネットワークをロードする方法は次のとおりです。
FileInfo file = new FileInfo ( @"C:...MySavedNetwork.nnet" ) ;
INeuralNetwork network = NetworkLoader . TryLoad ( file , ExecutionModePreference . Cuda ) ;
注: ExecutionModePreference
オプションは、可能な限り脱色するために望ましいタイプのレイヤーを示します。たとえば、 ExecutionModePreference.Cpu
を使用すると、ロードされたネットワークには、サポートされている場合のCPU駆動層のみがあります。
また、 INeuralNetwork
インスタンスのメタデータをエクスポートするための追加のSaveMetadataAsJson
メソッドもあります。
NeuralNetworkNET.Datasets
名前空間には、人気のあるデータセットをすばやくロードし、新しいニューラルネットワークで使用できるIDataset
インスタンスを入手する静的クラスが含まれています。例として、MNISTデータセットを取得する方法は次のとおりです。
ITrainingDataset trainingData = await Mnist . GetTrainingDatasetAsync ( 400 ) ; // Batches of 400 samples
ITestDataset testData = await Mnist . GetTestDatasetAsync ( p => .. . /* Optional callback */ ) ;
この名前空間の各APIは、ソースデータがインターネットからダウンロードされ、使用されているデータセットに応じて時間がかかる可能性があるため、データセットの読み込みを停止するオプションのCancellationToken
もサポートしています。
neuralnetwork.netライブラリには.NET標準2.0サポートが必要なため、アプリケーションをターゲットにするために使用できます。
上記のフレームワークに加えて、PCでライブラリをコンパイルするためにC#7.3サポートを備えたIDEが必要です。