Neuralnetwork.net adalah perpustakaan .net standar 2.0 yang mengimplementasikan jaringan neural berurutan dan komputasi dengan lapisan yang dapat disesuaikan, dibangun dari awal dengan C#. Ini memberikan API sederhana yang dirancang untuk prototyping cepat untuk mendefinisikan dan melatih model menggunakan keturunan gradien stokastik, serta metode untuk menyimpan/memuat model jaringan dan metadata dan banyak lagi. Perpustakaan juga memaparkan lapisan CUDA yang dipercepat dengan fitur yang lebih canggih yang memanfaatkan GPU dan toolkit CUDNN untuk sangat meningkatkan kinerja saat melatih atau menggunakan jaringan saraf.
Penafian: Perpustakaan ini disediakan sebagaimana adanya, dan itu tidak lagi dipertahankan secara aktif. NeuralNetwork.net dikembangkan selama kursus universitas dan itu tidak dimaksudkan untuk menjadi pengganti kerangka pembelajaran mesin terkenal lainnya. Jika Anda mencari perpustakaan pembelajaran mesin untuk .NET untuk digunakan dalam produksi, saya sarankan mencoba ml.net atau alternatif TensorFlow.net.
Untuk menginstal neuralnetwork.net , jalankan perintah berikut di konsol manajer paket
Install-Package NeuralNetwork.NET
Rincian lebih lanjut tersedia di sini.
Perpustakaan NeuralNetwork.net memaparkan kelas dan metode yang mudah digunakan untuk membuat jaringan saraf baru, menyiapkan dataset untuk menggunakan dan melatih jaringan. API ini dirancang untuk prototyping cepat, dan bagian ini memberikan gambaran umum tentang langkah -langkah yang diperlukan untuk memulai.
Langkah pertama adalah membuat struktur jaringan khusus. Berikut adalah contoh dengan jaringan berurutan (tumpukan lapisan):
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 ) ) ;
Langkah selanjutnya adalah menyiapkan set data untuk digunakan, melalui API di kelas 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
} ) ;
Melatih jaringan saraf cukup mudah - cukup gunakan metode di kelas 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
Catatan: Metode NetworkManager
juga tersedia sebagai API asinkron.
Saat berjalan pada kerangka kerja yang didukung (.NET Framework, Xamarin atau Mono), dimungkinkan untuk menggunakan implementasi yang berbeda dari lapisan yang tersedia yang memanfaatkan toolkit CUDNN dan memparalelkan sebagian besar pekerjaan pada GPU yang tersedia CUDA. Untuk melakukan itu, cukup gunakan lapisan dari kelas CuDnnNetworkLayers
saat membuat jaringan.
Beberapa lapisan bertenaga CUDNN mendukung opsi tambahan daripada lapisan default. Inilah contohnya:
// 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
Contoh LayerFactory
ini dapat digunakan untuk membuat jaringan baru seperti dalam contoh CPU.
CATATAN: Untuk menggunakan fitur ini, toolkit CUDA dan CUDNN harus diinstal pada sistem saat ini, NVIDIA GeForce/Quadro GPU yang diaktifkan CUDA harus tersedia dan paket Alea Nuget harus diinstal dalam aplikasi menggunakan NeuralNetwork.network.net perpustakaan juga. Info tambahan tersedia di sini.
Beberapa struktur jaringan yang kompleks, seperti jaringan residual atau modul awal, tidak dapat dinyatakan sebagai struktur jaringan berurutan sederhana: di sinilah jaringan grafik komputasi berperan. Alih -alih meneruskan input melalui tumpukan linear lapisan, grafik perhitungan memiliki struktur spasial spesifik yang memungkinkan node yang berbeda dihubungkan bersama. Sebagai contoh, dimungkinkan untuk menyalurkan data melalui jalur pipa paralel yang berbeda yang digabungkan kemudian dalam grafik, atau memiliki pengklasifikasi tambahan yang berkontribusi pada gradien backpropagation selama fase pelatihan.
Jaringan grafik komputasi dibuat menggunakan API NetworkManager.NewGraph
, berikut adalah contohnya:
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 menyediakan berbagai pengaturan bersama yang tersedia melalui kelas NetworkSettings
. Kelas ini bertindak sebagai wadah untuk dengan cepat memeriksa dan memodifikasi pengaturan apa pun kapan saja, dan pengaturan ini akan mempengaruhi perilaku setiap instance INeuralNetwork
yang ada dan perpustakaan secara umum.
Misalnya, dimungkinkan untuk menyesuaikan kriteria yang digunakan oleh jaringan untuk memeriksa kinerja mereka selama pelatihan
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
Saat menggunakan jaringan bertenaga CUDA, kadang-kadang GPU yang digunakan mungkin tidak dapat memproses seluruh dataset tes atau validasi dalam satu pass, yang merupakan perilaku default (kumpulan data ini tidak dibagi menjadi batch). Untuk menghindari masalah memori, dimungkinkan untuk memodifikasi perilaku ini:
NetworkSettings . MaximumBatchSize = 400 ; // This will apply to any test or validation dataset
Antarmuka INeuralNetwork
memperlihatkan metode Save
yang dapat digunakan untuk membuat serialisasi jaringan apa pun pada waktu tertentu. Untuk mendapatkan instance jaringan baru dari file atau stream yang disimpan, cukup gunakan metode NetworkLoader.TryLoad
.
Karena beberapa jenis lapisan memiliki implementasi yang berbeda di seluruh perpustakaan yang tersedia, Anda dapat menentukan penyedia lapisan untuk digunakan saat memuat jaringan yang disimpan. Misalnya, inilah cara memuat jaringan menggunakan lapisan cudnn, jika memungkinkan:
FileInfo file = new FileInfo ( @"C:...MySavedNetwork.nnet" ) ;
INeuralNetwork network = NetworkLoader . TryLoad ( file , ExecutionModePreference . Cuda ) ;
Catatan: Opsi ExecutionModePreference
menunjukkan jenis lapisan yang diinginkan untuk deserialize bila memungkinkan. Misalnya, menggunakan ExecutionModePreference.Cpu
, jaringan yang dimuat hanya akan memiliki lapisan bertenaga CPU, jika didukung.
Ada juga metode SaveMetadataAsJson
tambahan untuk mengekspor metadata instance INeuralNetwork
.
NeuralNetworkNET.Datasets
namespace mencakup kelas statis untuk dengan cepat memuat dataset populer dan mendapatkan instance IDataset
siap digunakan dengan jaringan saraf baru. Sebagai contoh, inilah cara mendapatkan dataset MNIST:
ITrainingDataset trainingData = await Mnist . GetTrainingDatasetAsync ( 400 ) ; // Batches of 400 samples
ITestDataset testData = await Mnist . GetTestDatasetAsync ( p => .. . /* Optional callback */ ) ;
Setiap API dalam namespace ini juga mendukung CancellationToken
opsional untuk menghentikan pemuatan dataset, karena data sumber diunduh dari internet dan dapat membutuhkan waktu untuk tersedia, tergantung pada dataset yang digunakan.
Perpustakaan NeuralNetwork.net membutuhkan dukungan .NET Standar 2.0, sehingga tersedia untuk penargetan aplikasi:
Selain kerangka kerja di atas, Anda memerlukan IDE dengan dukungan C# 7.3 untuk mengkompilasi perpustakaan di PC Anda.