NeuralNetwork.net เป็นไลบรารี. NET Standard 2.0 ที่ใช้เครือข่าย Neural กราฟและการคำนวณที่มีเลเยอร์ที่ปรับแต่งได้สร้างขึ้นจากศูนย์ด้วย C# มันให้ API อย่างง่ายที่ออกแบบมาสำหรับการสร้างต้นแบบอย่างรวดเร็วเพื่อกำหนดและฝึกอบรมแบบจำลองโดยใช้การไล่ระดับสีแบบสุ่มรวมถึงวิธีการประหยัด/โหลดโมเดลเครือข่ายและข้อมูลเมตาและอื่น ๆ ห้องสมุดยังเผยให้เห็นเลเยอร์ที่เร่งด้วย CUDA ด้วยคุณสมบัติขั้นสูงที่ใช้ประโยชน์จาก GPU และชุดเครื่องมือ CUDNN เพื่อเพิ่มการแสดงอย่างมากเมื่อฝึกอบรมหรือใช้เครือข่ายประสาท
ข้อจำกัดความรับผิดชอบ: ห้องสมุดนี้มีให้ตามที่เป็นอยู่และมันไม่ได้รับการดูแลอย่างแข็งขันอีกต่อไป NeuralNetwork.net ได้รับการพัฒนาในช่วงหลักสูตรของมหาวิทยาลัยและไม่ได้หมายถึงการแทนที่กรอบการเรียนรู้ของเครื่องจักรที่รู้จักกันดีอื่น ๆ หากคุณกำลังมองหาไลบรารีการเรียนรู้ของเครื่องสำหรับ. NET ที่จะใช้ในการผลิตฉันขอแนะนำให้ลองใช้ ml.net หรือ tensorflow.net หรืออีกทางเลือกหนึ่ง
ในการติดตั้ง neuralnetwork.net ให้เรียกใช้คำสั่งต่อไปนี้ใน คอนโซลแพ็คเกจ Manager
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 ) ) ;
ขั้นตอนต่อไปคือการเตรียมชุดข้อมูลที่จะใช้ผ่าน APIs ในคลาส 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
เหล่านี้สามารถใช้เพื่อสร้างเครือข่ายใหม่เช่นเดียวกับในตัวอย่าง CPU
หมายเหตุ: ในการใช้คุณสมบัตินี้จะต้องติดตั้งชุดเครื่องมือ CUDA และ CUDNN ในระบบปัจจุบันต้องใช้ Nvidia GeForce/Quadro GPU ที่เปิดใช้งาน CUDA และต้องติดตั้งแพ็คเกจ 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
ระบุประเภทของเลเยอร์ที่ต้องการเพื่อ deserialize เมื่อเป็นไปได้ ตัวอย่างเช่นการใช้ ExecutionModePreference.Cpu
เครือข่ายที่โหลดจะมีเลเยอร์ที่ใช้ CPU เท่านั้นหากรองรับ
นอกจากนี้ยังมีวิธี SaveMetadataAsJson
เพิ่มเติมในการส่งออกข้อมูลเมตาของ INeuralNetwork
แตนซ์ Ineuralnetwork
Namespace 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 เพื่อรวบรวมไลบรารีบนพีซีของคุณ