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上的库。