Neuralnetwork.net은 C#으로 처음부터 구축 된 사용자 정의 가능한 레이어를 사용하여 순차적 및 계산 그래프 신경망을 구현하는 .NET Standard 2.0 라이브러리입니다. 확률 적 구배 하강을 사용하여 모델과 메타 데이터 등을 저장/로드하는 방법뿐만 아니라 신속한 프로토 타이핑을 위해 설계된 간단한 API를 제공합니다. 이 라이브러리는 또한 GPU와 CUDNN 툴킷을 활용하여 신경망을 사용할 때 성능을 크게 증가시켜 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 Framework, 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 을 사용하여 응용 프로그램에 설치해야합니다. 도서관도. 추가 정보는 여기에서 확인할 수 있습니다.
잔류 네트워크 또는 Inception 모듈과 같은 일부 복잡한 네트워크 구조는 간단한 순차적 네트워크 구조로 표현할 수 없습니다. 이곳에서 계산 그래프 네트워크가 작동하는 곳입니다. 선형 레이어 스택을 통해 입력을 전달하는 대신, 계산 그래프에는 서로 다른 노드를 함께 연결할 수있는 특정 공간 구조가 있습니다. 예를 들어, 그래프에서 나중에 병합되는 다른 병렬 파이프 라인을 통해 데이터를 채널로 만들거나 훈련 단계 동안 그라디언트 역전술에 기여하는 보조 분류기가있을 수 있습니다.
계산 그래프 네트워크는 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 Standard 2.0 지원이 필요하므로 응용 프로그램 타겟팅에 사용할 수 있습니다.
위의 프레임 워크 외에도 PC에서 라이브러리를 컴파일하려면 C# 7.3 지원이 필요한 IDE가 필요합니다.