NeuralNetwork.net هي مكتبة .NET Standard 2.0 التي تنفذ الشبكات العصبية الرسم البياني المتسلسل والحساب مع طبقات قابلة للتخصيص ، مبنية من نقطة الصفر مع C#. إنه يوفر واجهات برمجة التطبيقات البسيطة المصممة للنماذج الأولية السريعة لتحديد النماذج وتدريبها باستخدام نزول التدرج العشوائي ، بالإضافة إلى طرق لحفظ/تحميل نموذج الشبكة وبياناته الأولية والمزيد. تكشف المكتبة أيضًا طبقات من CUDA مع ميزات أكثر تقدمًا تستفيد من GPU ومجموعة أدوات CUDNN لزيادة العروض بشكل كبير عند التدريب أو استخدام شبكة عصبية.
إخلاء المسئولية: يتم توفير هذه المكتبة كما هي ، ولم يعد يتم الحفاظ عليها بنشاط. تم تطوير NeuralNetwork.net خلال دورة جامعية ، وليس من المفترض أن تكون بديلاً لأطر التعلم الآلي المعروفة جيدًا. إذا كنت تبحث عن مكتبة تعلم الآلة لـ .NET لاستخدامها في الإنتاج ، فإنني أوصي بتجربة ML.NET أو بدلاً من ذلك tensorflow.net.
لتثبيت neuralnetwork.net ، قم بتشغيل الأمر التالي في وحدة تحكم Package Manager
Install-Package NeuralNetwork.NET
مزيد من التفاصيل المتاحة هنا.
تعرض مكتبة NeuralNetwork.net الفصول والأساليب سهلة الاستخدام لإنشاء شبكة عصبية جديدة ، وإعداد مجموعات البيانات لاستخدام الشبكة وتدريبها. تم تصميم واجهات برمجة التطبيقات هذه للنماذج الأولية السريعة ، ويوفر هذا القسم نظرة عامة على الخطوات المطلوبة للبدء.
الخطوة الأولى هي إنشاء بنية شبكة مخصصة. فيما يلي مثال على شبكة متتابعة (كومة من الطبقات):
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
:
// 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
أيضًا كواجهة برمجة تطبيقات غير متزامنة.
عند التشغيل على إطار عمل مدعوم (.NET Framework أو Xamarin أو Mono) ، من الممكن استخدام تطبيق مختلف للطبقات المتاحة التي تستفيد من مجموعة أدوات Cudnn وتتوازى معظم العمل على وحدة معالجة الرسومات المتاحة 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
لإنشاء شبكة جديدة كما هو الحال في مثال وحدة المعالجة المركزية.
ملاحظة: من أجل استخدام هذه الميزة ، يجب تثبيت مجموعات أدوات CUDA و CUDNN على النظام الحالي ، ويجب أن تتوفر NVIDIA GEFORCE/Quadro GPU من CUDA ويجب تثبيت حزمة alea nuget في التطبيق باستخدام neuralnetwork.net.net مكتبة كذلك. معلومات إضافية متوفرة هنا.
لا يمكن التعبير عن بعض هياكل الشبكة المعقدة ، مثل الشبكات المتبقية أو وحدات التأسيس ، كهيكل شبكة متسلسل بسيط: هذا هو المكان الذي يتم فيه تشغيل شبكات الرسم البياني للحساب. بدلاً من إعادة توجيه المدخلات من خلال كومة خطية من الطبقات ، يحتوي الرسم البياني للحساب على بنية مكانية محددة تتيح توصيل العقد المختلفة معًا. على سبيل المثال ، من الممكن توجيه البيانات من خلال خطوط أنابيب متوازية مختلفة يتم دمجها لاحقًا في الرسم البياني ، أو أن يكون لها مصنفات مساعدة تساهم في التراجع المتدرج خلال مرحلة التدريب.
يتم إنشاء شبكات الرسم البياني للحساب باستخدام 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 التي تعمل بالطاقة ، قد لا تكون وحدة معالجة الرسومات المستخدمة في بعض الأحيان قادرة على معالجة مجموعات بيانات الاختبار أو التحقق من الصحة بأكملها في تمريرة واحدة ، وهو السلوك الافتراضي (لا يتم تقسيم مجموعات البيانات هذه إلى دفعات). لتجنب مشكلات الذاكرة ، من الممكن تعديل هذا السلوك:
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
، سيكون للشبكة المحملة فقط طبقات تعمل بالطاقة المعالجة المركزية ، إذا تم دعمها.
هناك أيضًا طريقة إضافية SaveMetadataAsJson
لتصدير البيانات الوصفية لمثيل INeuralNetwork
.
تتضمن مساحة الاسم NeuralNetworkNET.Datasets
فئات ثابتة لتحميل مجموعة بيانات شهيرة بسرعة والحصول على مثيل IDataset
جاهز للاستخدام مع شبكة عصبية جديدة. على سبيل المثال ، إليك كيفية الحصول على مجموعة بيانات MNIST:
ITrainingDataset trainingData = await Mnist . GetTrainingDatasetAsync ( 400 ) ; // Batches of 400 samples
ITestDataset testData = await Mnist . GetTestDatasetAsync ( p => .. . /* Optional callback */ ) ;
تدعم كل واجهة برمجة تطبيقات في مساحة الاسم هذه أيضًا مجموعة اختيارية CancellationToken
تحميل مجموعة البيانات ، حيث يتم تنزيل بيانات المصدر من الإنترنت ويمكن أن تستغرق بعض الوقت لتكون متاحة ، اعتمادًا على مجموعة البيانات المستخدمة.
تتطلب مكتبة NeuralNetwork.net دعم .NET Standard 2.0 ، لذلك فهي متاحة للتطبيقات التي تستهدف:
بالإضافة إلى الأطر المذكورة أعلاه ، تحتاج إلى IDE مع دعم C# 7.3 لتجميع المكتبة على جهاز الكمبيوتر الخاص بك.