GPU تسارع الشبكات العصبية في JavaScript للمتصفحات و node.js
brain.js هي مكتبة معالجة GPU المتسارعة للشبكات العصبية المكتوبة في JavaScript.
هذا استمرار ل Harthur/Brain ، والذي لم يعد يتم الحفاظ عليه. مزيد من المعلومات
RNNTimeStep و LSTMTimeStep و GRUTimeStepRNN و LSTM و GRUAElikelytoSVG إذا كنت تستطيع تثبيت brain.js مع NPM:
npm install brain.js < script src =" //unpkg.com/brain.js " > </ script >قم بتنزيل أحدث Brain.js للمتصفح
Brain.js يعتمد على وحدة headless-gl لدعم GPU. في معظم الحالات ، يجب أن تعمل brain.js من NPM. ومع ذلك ، إذا واجهت مشكلات ، فهذا يعني أن الثنائيات المسبقة غير قادرة على التنزيل من مستودعات GitHub وقد تحتاج إلى بنائه بنفسك.
يرجى التأكد من تثبيت التبعيات التالية وحتى الآن ثم تشغيلها:
npm rebuildbuild-essential على apt )sudo apt-get install -y build-essential libglew-dev libglu1-mesa-dev libxi-dev pkg-confignpm config set msvs_version 2022 ملاحظة: لم يعد هذا يعمل في الإصدارات الحديثة من NPM.npm config set python python3 ملاحظة: لم يعد هذا يعمل في الإصدارات الحديثة من NPM. * إذا كنت تستخدم Build Tools 2017 فقم بتشغيل npm config set msvs_version 2017 ملاحظة: لم يعد هذا يعمل في الإصدارات الحديثة من NPM.
إليك مثال يعرض كيفية تقريب وظيفة XOR باستخدام brain.js : مزيد من المعلومات على التكوين هنا.
مقدمة ممتعة وعملية لـ Brain.js
// provide optional config object (or undefined). Defaults shown.
const config = {
binaryThresh : 0.5 ,
hiddenLayers : [ 3 ] , // array of ints for the sizes of the hidden layers in the network
activation : 'sigmoid' , // supported activation types: ['sigmoid', 'relu', 'leaky-relu', 'tanh'],
leakyReluAlpha : 0.01 , // supported for activation type 'leaky-relu'
} ;
// create a simple feed-forward neural network with backpropagation
const net = new brain . NeuralNetwork ( config ) ;
net . train ( [
{ input : [ 0 , 0 ] , output : [ 0 ] } ,
{ input : [ 0 , 1 ] , output : [ 1 ] } ,
{ input : [ 1 , 0 ] , output : [ 1 ] } ,
{ input : [ 1 , 1 ] , output : [ 0 ] } ,
] ) ;
const output = net . run ( [ 1 , 0 ] ) ; // [0.987]أو مزيد من المعلومات على التكوين هنا.
// provide optional config object, defaults shown.
const config = {
inputSize : 20 ,
inputRange : 20 ,
hiddenLayers : [ 20 , 20 ] ,
outputSize : 20 ,
learningRate : 0.01 ,
decayRate : 0.999 ,
} ;
// create a simple recurrent neural network
const net = new brain . recurrent . RNN ( config ) ;
net . train ( [
{ input : [ 0 , 0 ] , output : [ 0 ] } ,
{ input : [ 0 , 1 ] , output : [ 1 ] } ,
{ input : [ 1 , 0 ] , output : [ 1 ] } ,
{ input : [ 1 , 1 ] , output : [ 0 ] } ,
] ) ;
let output = net . run ( [ 0 , 0 ] ) ; // [0]
output = net . run ( [ 0 , 1 ] ) ; // [1]
output = net . run ( [ 1 , 0 ] ) ; // [1]
output = net . run ( [ 1 , 1 ] ) ; // [0]ومع ذلك ، لا يوجد سبب لاستخدام شبكة عصبية لمعرفة XOR. (-: إذن ، إليك مثال أكثر واقعية مشاركة: العرض التوضيحي: تدريب شبكة عصبية للتعرف على تباين الألوان.
دماغ. js أمثلة repo
يمكنك الاطلاع على هذا الشاشة الرائعة ، والتي تشرح كيفية تدريب شبكة عصبية بسيطة باستخدام مجموعة بيانات في العالم الحقيقي: كيفية إنشاء شبكة عصبية في المتصفح باستخدام Brain.js.
استخدم train() لتدريب الشبكة بمجموعة من بيانات التدريب. يجب تدريب الشبكة مع جميع البيانات بكميات كبيرة في مكالمة واحدة إلى train() . من المحتمل أن تستغرق المزيد من أنماط التدريب وقتًا أطول للتدريب ، ولكنها عادة ما تؤدي إلى شبكة أفضل في تصنيف أنماط جديدة.
التدريب مكلف حسابيًا ، لذلك يجب أن تحاول تدريب الشبكة دون اتصال بالإنترنت (أو على عامل) واستخدام خيارات toFunction() أو toJSON() لتوصيل الشبكة المدربة مسبقًا على موقع الويب الخاص بك.
NeuralNetwork يجب أن يكون لكل نمط تدريب input output ، وكلاهما يمكن أن يكون إما مجموعة من الأرقام من 0 إلى 1 أو تجزئة الأرقام من 0 إلى 1 . من أجل العرض التجريبي على تباين اللون ، يبدو شيئًا من هذا القبيل:
const net = new brain . NeuralNetwork ( ) ;
net . train ( [
{ input : { r : 0.03 , g : 0.7 , b : 0.5 } , output : { black : 1 } } ,
{ input : { r : 0.16 , g : 0.09 , b : 0.2 } , output : { white : 1 } } ,
{ input : { r : 0.5 , g : 0.5 , b : 1.0 } , output : { white : 1 } } ,
] ) ;
const output = net . run ( { r : 1 , g : 0.4 , b : 0 } ) ; // { white: 0.99, black: 0.002 }إليك تباين آخر في المثال أعلاه. ( لاحظ أن كائنات الإدخال لا تحتاج إلى أن تكون متشابهة.)
net . train ( [
{ input : { r : 0.03 , g : 0.7 } , output : { black : 1 } } ,
{ input : { r : 0.16 , b : 0.2 } , output : { white : 1 } } ,
{ input : { r : 0.5 , g : 0.5 , b : 1.0 } , output : { white : 1 } } ,
] ) ;
const output = net . run ( { r : 1 , g : 0.4 , b : 0 } ) ; // { white: 0.81, black: 0.18 } RNNTimeStep و LSTMTimeStep و GRUTimeStepيمكن لكل نمط تدريب إما:
مثال باستخدام مجموعة من الأرقام:
const net = new brain . recurrent . LSTMTimeStep ( ) ;
net . train ( [ [ 1 , 2 , 3 ] ] ) ;
const output = net . run ( [ 1 , 2 ] ) ; // 3مثال باستخدام مجموعة من صفائف الأرقام:
const net = new brain . recurrent . LSTMTimeStep ( {
inputSize : 2 ,
hiddenLayers : [ 10 ] ,
outputSize : 2 ,
} ) ;
net . train ( [
[ 1 , 3 ] ,
[ 2 , 2 ] ,
[ 3 , 1 ] ,
] ) ;
const output = net . run ( [
[ 1 , 3 ] ,
[ 2 , 2 ] ,
] ) ; // [3, 1] RNN و LSTM و GRUيمكن لكل نمط تدريب إما:
input outputتحذير: عند استخدام مجموعة من القيم ، يمكنك استخدام أي قيمة ، ومع ذلك ، يتم تمثيل القيم في الشبكة العصبية عن طريق إدخال واحد. وبالتالي فإن القيم الأكثر تميزا لديها أكبر طبقة الإدخال الخاصة بك . إذا كان لديك مئات أو آلاف أو ملايين من قيم النقاط العائمة ، فهذا ليس الفئة الصحيحة للمهمة . أيضًا ، عند الانحراف عن الأوتار ، يدخل هذا الإصدار التجريبي
مثال باستخدام الأوتار المباشرة: Hello World باستخدام BrainJs
const net = new brain . recurrent . LSTM ( ) ;
net . train ( [ 'I am brainjs, Hello World!' ] ) ;
const output = net . run ( 'I am brainjs' ) ;
alert ( output ) ; const net = new brain . recurrent . LSTM ( ) ;
net . train ( [
'doe, a deer, a female deer' ,
'ray, a drop of golden sun' ,
'me, a name I call myself' ,
] ) ;
const output = net . run ( 'doe' ) ; // ', a deer, a female deer'مثال باستخدام السلاسل مع المدخلات والمخرجات:
const net = new brain . recurrent . LSTM ( ) ;
net . train ( [
{ input : 'I feel great about the world!' , output : 'happy' } ,
{ input : 'The world is a terrible place!' , output : 'sad' } ,
] ) ;
const output = net . run ( 'I feel great about the world!' ) ; // 'happy' AEيمكن لكل نمط تدريب إما:
تدريب Autoender لضغط قيم حساب XOR:
const net = new brain . AE (
{
hiddenLayers : [ 5 , 2 , 5 ]
}
) ;
net . train ( [
[ 0 , 0 , 0 ] ,
[ 0 , 1 , 1 ] ,
[ 1 , 0 , 1 ] ,
[ 1 , 1 , 0 ]
] ) ;الترميز/فك التشفير:
const input = [ 0 , 1 , 1 ] ;
const encoded = net . encode ( input ) ;
const decoded = net . decode ( encoded ) ;بيانات Denoise صاخبة:
const noisyData = [ 0 , 1 , 0 ] ;
const data = net . denoise ( noisyData ) ;اختبار الحالات الشاذة في عينات البيانات:
const shouldBeFalse = net . includesAnomalies ( [ 0 , 1 , 1 ] ) ;
const shouldBeTrue = net . includesAnomalies ( [ 0 , 1 , 0 ] ) ; يأخذ train() تجزئة من الخيارات كحجة ثانية:
net . train ( data , {
// Defaults values --> expected validation
iterations : 20000 , // the maximum times to iterate the training data --> number greater than 0
errorThresh : 0.005 , // the acceptable error percentage from training data --> number between 0 and 1
log : false , // true to use console.log, when a function is supplied it is used --> Either true or a function
logPeriod : 10 , // iterations between logging out --> number greater than 0
learningRate : 0.3 , // scales with delta to effect training rate --> number between 0 and 1
momentum : 0.1 , // scales with next layer's change value --> number between 0 and 1
callback : null , // a periodic call back that can be triggered while training --> null or function
callbackPeriod : 10 , // the number of iterations through the training data between callback calls --> number greater than 0
timeout : number , // the max number of milliseconds to train for --> number greater than 0. Default --> Infinity
} ) ; ستتوقف الشبكة عن التدريب كلما تم استيفاء أحد المعايير: لقد تم تحديد خطأ التدريب إلى ما دون العتبة (الافتراضي 0.005 ) ، أو تم الوصول إلى عدد أقصى التكرارات (Default 20000 ).
بشكل افتراضي ، لن يعلمك التدريب كيف يحدث حتى النهاية ، ولكن قم بتعيين log على true للحصول على تحديثات دورية على خطأ التدريب الحالي للشبكة. يجب أن ينخفض خطأ التدريب في كل مرة. سيتم طباعة التحديثات إلى وحدة التحكم. إذا قمت بتعيين log على وظيفة ، فسيتم استدعاء هذه الوظيفة مع التحديثات بدلاً من الطباعة على وحدة التحكم. ومع ذلك ، إذا كنت ترغب في استخدام قيم التحديثات في الإخراج الخاص بك ، فيمكن ضبط callback على وظيفة للقيام بذلك بدلاً من ذلك.
معدل التعلم هو معلمة تؤثر على مدى سرعة تدريب الشبكة. إنه رقم من 0 إلى 1 . إذا كان معدل التعلم قريبًا من 0 ، فسوف يستغرق التدريب وقتًا أطول. إذا كان معدل التعلم أقرب إلى 1 ، فسيتم تدريبه بشكل أسرع ، ولكن قد تكون نتائج التدريب مقيدة على الحد الأدنى المحلي وأداء بشكل سيء على البيانات الجديدة. ( التغلب على ) معدل التعلم الافتراضي هو 0.3 .
يشبه الزخم معدل التعلم ، ويتوقع قيمة من 0 إلى 1 أيضًا ، ولكن يتم مضاعفته مقابل قيمة تغيير المستوى التالي. القيمة الافتراضية هي 0.1
يمكن نقل أي من خيارات التدريب هذه إلى المُنشئ أو تم نقلها إلى طريقة updateTrainingOptions(opts) وسيتم حفظها على الشبكة واستخدامها خلال وقت التدريب. إذا قمت بحفظ شبكتك إلى JSON ، فسيتم حفظ خيارات التدريب هذه واستعادتها أيضًا (باستثناء رد الاتصال وسجل ، سيتم نسيان رد الاتصال وسيتم استعادة السجل باستخدام console.log).
تم تعيين خاصية منطقية تسمى invalidTrainOptsShouldThrow على true بشكل افتراضي. على الرغم من أن الخيار true ، إذا قمت بإدخال خيار تدريب خارج النطاق الطبيعي ، فسيتم طرح خطأ برسالة حول الخيار غير الطبيعي. عندما يتم تعيين الخيار على false ، لن يتم إرسال أي خطأ ، ولكن سيظل هناك رسالة إلى console.warn مع المعلومات ذات الصلة.
يأخذ trainAsync() نفس الحجج مثل القطار (البيانات والخيارات). بدلاً من إرجاع كائن النتائج من التدريب ، فإنه يعيد وعدًا بأنه عند حل سيعيد كائن نتائج التدريب. لا يعمل مع:
brain.recurrent.RNNbrain.recurrent.GRUbrain.recurrent.LSTMbrain.recurrent.RNNTimeStepbrain.recurrent.GRUTimeStepbrain.recurrent.LSTMTimeStep const net = new brain . NeuralNetwork ( ) ;
net
. trainAsync ( data , options )
. then ( ( res ) => {
// do something with my trained network
} )
. catch ( handleError ) ;مع شبكات متعددة يمكنك التدريب بالتوازي مثل هذا:
const net = new brain . NeuralNetwork ( ) ;
const net2 = new brain . NeuralNetwork ( ) ;
const p1 = net . trainAsync ( data , options ) ;
const p2 = net2 . trainAsync ( data , options ) ;
Promise . all ( [ p1 , p2 ] )
. then ( ( values ) => {
const res = values [ 0 ] ;
const res2 = values [ 1 ] ;
console . log (
`net trained in ${ res . iterations } and net2 trained in ${ res2 . iterations } `
) ;
// do something super cool with my 2 trained networks
} )
. catch ( handleError ) ;يمكن أن يوفر التحقق من صحة التبادل طريقة أقل هشاشة للتدريب على مجموعات البيانات الأكبر. يوفر Brain.js API التحقق المتقاطع في هذا المثال:
const crossValidate = new brain . CrossValidate ( ( ) => new brain . NeuralNetwork ( networkOptions ) ) ;
crossValidate . train ( data , trainingOptions , k ) ; //note k (or KFolds) is optional
const json = crossValidate . toJSON ( ) ; // all stats in json as well as neural networks
const net = crossValidate . toNeuralNetwork ( ) ; // get top performing net out of `crossValidate`
// optionally later
const json = crossValidate . toJSON ( ) ;
const net = crossValidate . fromJSON ( json ) ; استخدم CrossValidate مع هذه الفئات:
brain.NeuralNetworkbrain.RNNTimeStepbrain.LSTMTimeStepbrain.GRUTimeStepيمكن العثور على مثال على استخدام التحقق من صحة المتقاطع في.
train(trainingData) -> TrainingStatus إخراج train() هو تجزئة من المعلومات حول كيفية ذهب التدريب:
{
error : 0.0039139985510105032 , // training error
iterations : 406 // training iterations
}run(input) -> التنبؤمدعوم في الفصول:
brain.NeuralNetworkbrain.NeuralNetworkGPU -> جميع وظائف brain.NeuralNetwork ولكن ، تم تشغيلها على GPU (عبر GPU.JS في WebGL2 أو WebGL1 أو احتياطي إلى وحدة المعالجة المركزية)brain.recurrent.RNNbrain.recurrent.LSTMbrain.recurrent.GRUbrain.recurrent.RNNTimeStepbrain.recurrent.LSTMTimeStepbrain.recurrent.GRUTimeStepمثال:
// feed forward
const net = new brain . NeuralNetwork ( ) ;
net . fromJSON ( json ) ;
net . run ( input ) ;
// time step
const net = new brain . LSTMTimeStep ( ) ;
net . fromJSON ( json ) ;
net . run ( input ) ;
// recurrent
const net = new brain . LSTM ( ) ;
net . fromJSON ( json ) ;
net . run ( input ) ;forecast(input, count) -> التنبؤاتمتاح مع الفصول التالية. يخرج مجموعة من التنبؤات. التنبؤات كونها استمرار للمدخلات.
brain.recurrent.RNNTimeStepbrain.recurrent.LSTMTimeStepbrain.recurrent.GRUTimeStepمثال:
const net = new brain . LSTMTimeStep ( ) ;
net . fromJSON ( json ) ;
net . forecast ( input , 3 ) ;toJSON() -> jsonتسلسل الشبكة العصبية إلى JSON
fromJSON(json)تخلص من الشبكة العصبية من JSON
إذا فشلت الشبكة في التدريب ، فسيكون الخطأ أعلى من عتبة الخطأ. قد يحدث هذا إذا كانت بيانات التدريب صاخبة للغاية (على الأرجح) ، لا تحتوي الشبكة على طبقات أو عقد مخفية كافية للتعامل مع تعقيد البيانات ، أو لم يتم تدريبها على التكرارات الكافية.
إذا كان خطأ التدريب لا يزال شيئًا ضخمًا مثل 0.4 بعد 20000 تكرار ، فهذا علامة جيدة على أن الشبكة لا يمكنها فهم البيانات المحددة.
يمكن ضبط مثيل خاصية Net maxPredictionLength (الافتراضي 100) لضبط إخراج الشبكة ؛
مثال:
const net = new brain . recurrent . LSTM ( ) ;
// later in code, after training on a few novels, write me a new one!
net . maxPredictionLength = 1000000000 ; // Be careful!
net . run ( 'Once upon a time' ) ; التسلسل أو التحميل في حالة شبكة مدربة مع JSON:
const json = net . toJSON ( ) ;
net . fromJSON ( json ) ; يمكنك أيضًا الحصول على وظيفة مستقلة مخصصة من شبكة مدربة تعمل تمامًا مثل run() :
const run = net . toFunction ( ) ;
const output = run ( { r : 1 , g : 0.4 , b : 0 } ) ;
console . log ( run . toString ( ) ) ; // copy and paste! no need to import brain.js يأخذ NeuralNetwork() تجزئة من الخيارات:
const net = new brain . NeuralNetwork ( {
activation : 'sigmoid' , // activation function
hiddenLayers : [ 4 ] ,
learningRate : 0.6 , // global learning rate, useful when training using streams
} ) ;تتيح لك هذه المعلمة تحديد وظيفة التنشيط التي يجب أن تستخدمها شبكتك العصبية. يوجد حاليًا أربع وظائف تنشيط مدعومة ، Sigmoid كونها الافتراضي:
إليك جدول (شكرًا ، ويكيبيديا!) يلخص عددًا كبيرًا من وظائف التنشيط - وظيفة التنشيط
يمكنك استخدام هذا لتحديد عدد الطبقات المخفية في الشبكة وحجم كل طبقة. على سبيل المثال ، إذا كنت تريد طبقتين مخفيتين - الأول مع 3 عقد والثاني مع 4 عقد ، فسوف تعطي:
hiddenLayers: [ 3 , 4 ] ; بشكل افتراضي ، يستخدم brain.js طبقة مخفية واحدة ذات حجم يتناسب مع حجم صفيف الإدخال.
استخدم https://www.npmjs.com/package/train tream لدفق البيانات إلى عمل عصبي
likely const likely = require ( 'brain/likely' ) ;
const key = likely ( input , net ) ;مثال محتمل راجع: اكتشاف الحروف البسيطة
toSVG < script src = "../../src/utilities/svg.js" > </ script >يجعل طوبولوجيا الشبكة لشبكة التغذية
document . getElementById ( 'result' ) . innerHTML = brain . utilities . toSVG (
network ,
options
) ;مثال TOSVG انظر: عرض الشبكة
واجهة المستخدم المستخدمة: 
brain.NeuralNetwork - شبكة عصبية تغذية مع خلفيةbrain.NeuralNetworkGPU - شبكة عصبية Feedforward مع backpropagation ، إصدار GPUbrain.AE - Autoencoder أو "AE" مع Packpropogation ودعم GPUbrain.recurrent.RNNTimeStep - خطوة الوقت الشبكة العصبية أو "rnn"brain.recurrent.LSTMTimeStepbrain.recurrent.GRUTimeStepbrain.recurrent.RNN - الشبكة العصبية المتكررة أو "RNN"brain.recurrent.LSTM - شبكة عصبية قصيرة الأجل قصيرة الأجل أو "LSTM"brain.recurrent.GRUbrain.FeedForward - شبكة عصبية قابلة للتخصيص للغاية مع backpropagationbrain.Recurrent - شبكة عصبية متكررة قابلة للتخصيص للغاية مع backpropagationالشبكات العصبية المختلفة تفعل أشياء مختلفة بشكل جيد. على سبيل المثال:
إذا كنت مطورًا أو إذا كنت تهتم فقط بكيفية ظهور ML API - يرجى المشاركة والانضمام إلى مجتمع W3C ومشاركة آرائك أو ببساطة دعم الآراء التي تحبها أو توافق عليها.
Brain.js هي مكتبة التعلم الآلي مفتوحة المصدر المعتمدة على نطاق واسع في عالم JavaScript. هناك عدة أسباب لذلك ، ولكن أبرزها هو بساطة الاستخدام مع عدم التضحية بالأداء . نود أن نبقي أيضًا أمرًا بسيطًا للتعلم ، وسهلة الاستخدام والأداء عندما يتعلق الأمر بمعايير W3C. نعتقد أن API Current Brain.js قريبة جدًا مما يمكن أن نتوقع أن يصبح معيارًا. وبما أن الدعم لا يتطلب الكثير من الجهد ولا يزال بإمكانه إحداث تغيير كبير ، فلا تتردد في الانضمام إلى مجموعة مجتمع W3C ودعمنا مع Brain.js مثل API.
الانخراط في عملية التعلم الآلي W3C عملية توحيد مستمر هنا. يمكنك أيضًا الانضمام إلى مناقشتنا المفتوحة حول التقييس هنا.
إذا كان لديك مشكلة ، إما خطأ أو ميزة تعتقد أنها ستفيد مشروعك ، فأخبرنا وسنبذل قصارى جهدنا.
إنشاء مشكلات هنا واتبع القالب.
Source for brain.js.org متاح في مستودع Brain.js.org. بنيت باستخدام Awesome vue.js & bulma . المساهمات دائما موضع ترحيب.
هذا المشروع موجود بفضل جميع الأشخاص الذين يساهمون. [يساهم].
شكرا لجميع مؤيدينا! [كن مؤيدًا]
دعم هذا المشروع من خلال أن يصبح راعياً. سيظهر شعارك هنا مع رابط لموقع الويب الخاص بك. [كن راعياً]