Neuralnetwork.net - это библиотека стандарта 2.0, которая реализует последовательные и вычислительные нейронные сети с настраиваемыми уровнями, созданные с нуля с C#. Он обеспечивает простые API, предназначенные для быстрого прототипирования для определения и обучения моделей с использованием стохастического градиента, а также методы для сохранения/загрузки сетевой модели и ее метаданных и многого другого. Библиотека также раскрывает ускоренные слои CUDA более продвинутыми функциями, которые используют графический процессор и инструментарий 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 ) ) ;
Следующим шагом является подготовка наборов данных для использования через API в классе DatasetLoader
:
// 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 и параллелизирует большую часть работы по доступному GPU с поддержкой CUDA. Для этого просто используйте слои из класса 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
Compance можно использовать для создания новой сети, как в примере ЦП.
ПРИМЕЧАНИЕ. Чтобы использовать эту функцию, на текущей системе должны быть установлены наборы инструментов CUDA и CUDNN, необходимо быть доступно в приложении NVIDIA GEFORCE/Quadro GPU, и пакет Alea NUGET должен быть установлен в приложении с использованием NeuralNetwork.net. Библиотека. Дополнительная информация доступна здесь.
Некоторые сложные сетевые структуры, такие как остаточные сети или модули основания, не могут быть выражены в виде простой последовательной структуры сети: именно здесь вступают в игру вычислительные графические сети. Вместо пересылки входов через линейную стек слоев, график вычисления имеет определенную пространственную структуру, которая позволяет соединять различные узлы вместе. Например, можно направлять данные через различные параллельные трубопроводы, которые объединяются позже на графике, или иметь вспомогательные классификаторы, которые способствуют градиентному обратному распространению на этапе обучения.
Сеты графиков вычислений создаются с использованием API NetworkManager.NewGraph
, вот пример:
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, иногда используемый графический процессор может не иметь возможности обрабатывать все наборы данных тестирования или проверки за один проход, который является поведением по умолчанию (эти наборы данных не разделены на партии). Чтобы избежать проблем с памятью, можно изменить это поведение:
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 ) ;
Note: the ExecutionModePreference
option indicates the desired type of layers to deserialize whenever possible. Например, используя ExecutionModePreference.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
, чтобы остановить загрузку набора данных, так как исходные данные загружаются из Интернета и может потребоваться некоторое время, чтобы быть доступным, в зависимости от используемого набора данных.
Библиотека neuralnetwork.net требует поддержки .net Standard 2.0, поэтому она доступна для таргетинга приложений:
В дополнение к приведенным выше структуру, вам нужен IDE с поддержкой C# 7.3, чтобы скомпилировать библиотеку на вашем ПК.