NeuralNetwork.net是一個.NET標準2.0庫,它以可自定義的圖層實現順序和計算圖的神經網絡,並從頭開始使用C#構建。它提供了用於快速原型製作的簡單API,以使用隨機梯度下降來定義和訓練模型,以及保存/加載網絡模型及其元數據等的方法。圖書館還揭露了帶有更高級功能的CUDA加速層,這些特征利用GPU和Cudnn工具包極大地增加了訓練或使用神經網絡時的性能。
免責聲明:該庫是按原樣提供的,並且不再積極維護。 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 Toolkit的可用層的不同實現,並在可用的啟用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,並且必須使用Neuralnetwork.net進行應用程序,並且必須在應用程序中安裝Alea Nuget軟件包。圖書館。其他信息可在此處找到。
某些複雜的網絡結構,例如殘留網絡或啟動模塊,不能表示為簡單的順序網絡結構:這是計算圖網絡發揮作用的地方。計算圖沒有通過線性層來轉發輸入,而是具有特定的空間結構,可以將不同的節點連接在一起。例如,可以通過稍後在圖中合併的不同並行管道來引導數據,或具有在訓練階段有助於梯度反向傳播的輔助分類器。
計算圖網絡是使用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供電層。
還有另外一種SaveMetadataAsJson
方法來導出INeuralNetwork
實例的元數據。
NeuralNetworkNET.Datasets
名稱空間包括靜態類,以快速加載流行的數據集並獲取IDataset
實例,並準備與新的神經網絡一起使用。例如,這是獲取MNIST數據集的方法:
ITrainingDataset trainingData = await Mnist . GetTrainingDatasetAsync ( 400 ) ; // Batches of 400 samples
ITestDataset testData = await Mnist . GetTestDatasetAsync ( p => .. . /* Optional callback */ ) ;
此名稱空間中的每個API還支持可選的CancellationToken
,以停止數據集加載,因為從Internet下載了源數據,並且可能需要一些時間才能可用,具體取決於所使用的數據集。
neuralnetwork.net庫需要.NET標準2.0支持,因此可用於針對的應用程序:
除了上面的框架外,您還需要一個具有C#7.3支持的IDE來編譯PC上的庫。