GPU Neural Networks Di JavaScript untuk Browser dan Node.js
brain.js adalah perpustakaan yang dipercepat GPU untuk jaringan saraf yang ditulis dalam JavaScript.
Ini adalah kelanjutan dari Harthur/Brain , yang tidak dipertahankan lagi. Info lebih lanjut
RNNTimeStep , LSTMTimeStep dan GRUTimeStepRNN , LSTM dan GRUAElikelytoSVG Jika Anda dapat menginstal brain.js dengan NPM:
npm install brain.js < script src =" //unpkg.com/brain.js " > </ script >Unduh otak terbaru.js untuk browser
Brain.js tergantung pada modul asli headless-gl untuk dukungan GPU. Dalam kebanyakan kasus memasang brain.js dari NPM hanya berfungsi. Namun, jika Anda mengalami masalah, ini berarti binari prebuilt tidak dapat mengunduh dari repositori github dan Anda mungkin perlu membangunnya sendiri.
Pastikan dependensi berikut diinstal dan mutakhir dan kemudian jalankan:
npm rebuildbuild-essential di apt )sudo apt-get install -y build-essential libglew-dev libglu1-mesa-dev libxi-dev pkg-confignpm config set msvs_version 2022 CATATAN: Ini tidak lagi berfungsi dalam versi modern NPM.npm config set python python3 Catatan: Ini tidak lagi berfungsi dalam versi modern NPM. * Jika Anda menggunakan Build Tools 2017 maka jalankan npm config set msvs_version 2017 Catatan: Ini tidak lagi berfungsi dalam versi modern NPM.
Berikut adalah contoh yang menampilkan cara memperkirakan fungsi XOR menggunakan brain.js : Info lebih lanjut tentang konfigurasi di sini.
Pengantar yang menyenangkan dan praktis untuk otak.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]atau info lebih lanjut tentang konfigurasi di sini.
// 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]Namun, tidak ada alasan untuk menggunakan jaringan saraf untuk mencari tahu XOR. (-: Jadi, inilah contoh yang lebih terlibat, realistis: Demo: melatih jaringan saraf untuk mengenali kontras warna.
Contoh Brain.js Repo
Anda dapat melihat screencast yang fantastis ini, yang menjelaskan cara melatih jaringan saraf sederhana menggunakan dataset dunia nyata: cara membuat jaringan saraf di browser menggunakan Brain.js.
Gunakan train() untuk melatih jaringan dengan berbagai data pelatihan. Jaringan harus dilatih dengan semua data dalam jumlah besar dalam satu panggilan untuk train() . Lebih banyak pola pelatihan mungkin akan membutuhkan waktu lebih lama untuk berlatih, tetapi biasanya akan menghasilkan jaringan yang lebih baik dalam mengklasifikasikan pola baru.
Pelatihan mahal secara komputasi, jadi Anda harus mencoba melatih jaringan secara offline (atau pada pekerja) dan menggunakan opsi toFunction() atau toJSON() untuk mencolokkan jaringan pra-terlatih ke situs web Anda.
NeuralNetwork Setiap pola pelatihan harus memiliki input dan output , yang keduanya dapat berupa array angka dari 0 hingga 1 atau hash angka dari 0 hingga 1 . Untuk demo kontras warna, terlihat seperti ini:
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 }Inilah variasi lain dari contoh di atas. ( Perhatikan bahwa objek input tidak perlu serupa.)
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 dan GRUTimeStepSetiap pola pelatihan dapat:
Contoh Menggunakan Array Angka:
const net = new brain . recurrent . LSTMTimeStep ( ) ;
net . train ( [ [ 1 , 2 , 3 ] ] ) ;
const output = net . run ( [ 1 , 2 ] ) ; // 3Contoh Menggunakan Array Array Angka:
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 dan GRUSetiap pola pelatihan dapat:
input dan outputPerhatian: Saat menggunakan array nilai, Anda dapat menggunakan nilai apa pun, namun, nilai -nilai tersebut diwakili dalam jaringan saraf dengan satu input tunggal. Jadi semakin banyak nilai yang lebih berbeda memiliki semakin besar lapisan input Anda . Jika Anda memiliki ratusan, ribuan, atau jutaan nilai titik mengambang , ini bukan kelas yang tepat untuk pekerjaan itu . Juga, saat menyimpang dari string, ini masuk ke beta
Contoh Menggunakan String Langsung: Halo Dunia Menggunakan 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'Contoh Menggunakan string dengan input dan output:
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' AESetiap pola pelatihan dapat:
Melatih autoencoder untuk mengompres nilai perhitungan XOR:
const net = new brain . AE (
{
hiddenLayers : [ 5 , 2 , 5 ]
}
) ;
net . train ( [
[ 0 , 0 , 0 ] ,
[ 0 , 1 , 1 ] ,
[ 1 , 0 , 1 ] ,
[ 1 , 1 , 0 ]
] ) ;Pengkodean/decoding:
const input = [ 0 , 1 , 1 ] ;
const encoded = net . encode ( input ) ;
const decoded = net . decode ( encoded ) ;Data Denoise Noisy:
const noisyData = [ 0 , 1 , 0 ] ;
const data = net . denoise ( noisyData ) ;Tes untuk anomali dalam sampel data:
const shouldBeFalse = net . includesAnomalies ( [ 0 , 1 , 1 ] ) ;
const shouldBeTrue = net . includesAnomalies ( [ 0 , 1 , 0 ] ) ; train() mengambil hash opsi sebagai argumen kedua:
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
} ) ; Jaringan akan menghentikan pelatihan setiap kali salah satu dari dua kriteria dipenuhi: kesalahan pelatihan telah terjadi di bawah ambang batas (default 0.005 ), atau jumlah maksimum iterasi (default 20000 ) telah tercapai.
Secara default, pelatihan tidak akan memberi tahu Anda bagaimana keadaannya sampai akhir, tetapi atur log ke true untuk mendapatkan pembaruan berkala pada kesalahan pelatihan jaringan saat ini. Kesalahan pelatihan harus berkurang setiap saat. Pembaruan akan dicetak ke konsol. Jika Anda mengatur log ke fungsi, fungsi ini akan dipanggil dengan pembaruan alih -alih mencetak ke konsol. Namun, jika Anda ingin menggunakan nilai -nilai pembaruan di output Anda sendiri, callback dapat diatur ke fungsi untuk melakukannya sebagai gantinya.
Tingkat pembelajaran adalah parameter yang memengaruhi seberapa cepat jaringan berlatih. Itu angka dari 0 hingga 1 . Jika tingkat pembelajaran mendekati 0 , akan membutuhkan waktu lebih lama untuk berlatih. Jika tingkat pembelajaran lebih dekat ke 1 , itu akan melatih lebih cepat, tetapi hasil pelatihan dapat dibatasi untuk minimum lokal dan berkinerja buruk pada data baru. ( Overfitting ) Tingkat pembelajaran default adalah 0.3 .
Momentumnya mirip dengan tingkat pembelajaran, mengharapkan nilai dari 0 hingga 1 juga, tetapi dikalikan dengan nilai perubahan tingkat berikutnya. Nilai defaultnya adalah 0.1
Salah satu dari opsi pelatihan ini dapat diteruskan ke dalam konstruktor atau diteruskan ke metode updateTrainingOptions(opts) dan mereka akan disimpan di jaringan dan digunakan selama waktu pelatihan. Jika Anda menyimpan jaringan Anda ke JSON, opsi pelatihan ini disimpan dan dipulihkan juga (kecuali untuk panggilan balik dan log, panggilan balik akan dilupakan dan log akan dipulihkan menggunakan Console.log).
Properti boolean yang disebut invalidTrainOptsShouldThrow diatur ke true secara default. Meskipun opsi itu true , jika Anda memasukkan opsi pelatihan yang berada di luar kisaran normal, kesalahan akan dilemparkan dengan pesan tentang opsi abnormal. Ketika opsi diatur ke false , tidak ada kesalahan yang akan dikirim, tetapi pesan masih akan dikirim ke console.warn dengan informasi terkait.
trainAsync() mengambil argumen yang sama dengan kereta api (data dan opsi). Alih -alih mengembalikan objek hasil dari pelatihan, ia mengembalikan janji bahwa ketika diselesaikan akan mengembalikan objek hasil pelatihan. Tidak bekerja dengan:
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 ) ;Dengan beberapa jaringan Anda dapat berlatih secara paralel seperti ini:
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 ) ;Validasi silang dapat memberikan cara pelatihan yang kurang rapuh pada set data yang lebih besar. API Brain.js memberikan validasi silang dalam contoh ini:
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 ) ; Gunakan CrossValidate dengan kelas -kelas ini:
brain.NeuralNetworkbrain.RNNTimeStepbrain.LSTMTimeStepbrain.GRUTimeStepContoh menggunakan silang validasi dapat ditemukan di cross-validate.ts
train(trainingData) -> TrainingStatus Output train() adalah hash informasi tentang bagaimana pelatihan berjalan:
{
error : 0.0039139985510105032 , // training error
iterations : 406 // training iterations
}run(input) -> PrediksiDidukung di kelas:
brain.NeuralNetworkbrain.NeuralNetworkGPU -> semua fungsionalitas brain.NeuralNetwork tetapi, berlari di GPU (melalui GPU.js di WebGL2, WebGL1, atau Fallback ke CPU)brain.recurrent.RNNbrain.recurrent.LSTMbrain.recurrent.GRUbrain.recurrent.RNNTimeStepbrain.recurrent.LSTMTimeStepbrain.recurrent.GRUTimeStepContoh:
// 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) -> prediksiTersedia dengan kelas -kelas berikut. Mengeluarkan serangkaian prediksi. Prediksi menjadi kelanjutan dari input.
brain.recurrent.RNNTimeStepbrain.recurrent.LSTMTimeStepbrain.recurrent.GRUTimeStepContoh:
const net = new brain . LSTMTimeStep ( ) ;
net . fromJSON ( json ) ;
net . forecast ( input , 3 ) ;toJSON() -> jsonSerialize Neural Network ke JSON
fromJSON(json)Deserialize Neural Network dari JSON
Jika jaringan gagal berlatih, kesalahan akan berada di atas ambang batas kesalahan. Ini bisa terjadi jika data pelatihan terlalu berisik (kemungkinan besar), jaringan tidak memiliki cukup lapisan atau node tersembunyi untuk menangani kompleksitas data, atau belum dilatih untuk iterasi yang cukup.
Jika kesalahan pelatihan masih sangat besar seperti 0.4 setelah 20000 iterasi, itu adalah pertanda baik bahwa jaringan tidak dapat memahami data yang diberikan.
Contoh properti net maxPredictionLength (default 100) dapat diatur untuk menyesuaikan output dari internet;
Contoh:
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' ) ; Serialize atau muat dalam keadaan jaringan terlatih dengan JSON:
const json = net . toJSON ( ) ;
net . fromJSON ( json ) ; Anda juga bisa mendapatkan fungsi mandiri khusus dari jaringan terlatih yang bertindak seperti 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() mengambil hash opsi:
const net = new brain . NeuralNetwork ( {
activation : 'sigmoid' , // activation function
hiddenLayers : [ 4 ] ,
learningRate : 0.6 , // global learning rate, useful when training using streams
} ) ;Parameter ini memungkinkan Anda menentukan fungsi aktivasi mana yang harus digunakan jaringan saraf Anda. Saat ini ada empat fungsi aktivasi yang didukung, Sigmoid menjadi default:
Inilah meja (terima kasih, Wikipedia!) Meringkas sejumlah besar fungsi aktivasi - fungsi aktivasi
Anda dapat menggunakan ini untuk menentukan jumlah lapisan tersembunyi di jaringan dan ukuran setiap lapisan. Misalnya, jika Anda ingin dua lapisan tersembunyi - yang pertama dengan 3 node dan yang kedua dengan 4 node, Anda akan memberikan:
hiddenLayers: [ 3 , 4 ] ; Secara default brain.js menggunakan satu lapisan tersembunyi dengan ukuran proporsional dengan ukuran array input.
Gunakan https://www.npmjs.com/package/train-stream untuk mengalirkan data ke neuralnetwork
likely const likely = require ( 'brain/likely' ) ;
const key = likely ( input , net ) ;Contoh kemungkinan Lihat: Deteksi Surat Sederhana
toSVG < script src = "../../src/utilities/svg.js" > </ script >Membuat topologi jaringan jaringan feedforward
document . getElementById ( 'result' ) . innerHTML = brain . utilities . toSVG (
network ,
options
) ;Contoh TOSVG Lihat: Rendering jaringan
Antarmuka pengguna yang digunakan:
brain.NeuralNetwork - Jaringan saraf feedforward dengan backpropagationbrain.NeuralNetworkGPU - jaringan saraf feedforward dengan backpropagation, versi GPUbrain.AE - Autoencoder atau "AE" dengan backpropogation dan dukungan GPUbrain.recurrent.RNNTimeStep - Langkah Waktu Jaringan Saraf Berulang atau "RNN"brain.recurrent.LSTMTimeStep - Waktu Langkah Panjang Jaringan Neural Jangka Pendek atau "LSTM"brain.recurrent.GRUTimeStep - Langkah Waktu Unit Berulang Terkini atau "Gru"brain.recurrent.RNN - Jaringan Saraf Berulang atau "RNN"brain.recurrent.LSTM - Jaringan saraf memori jangka pendek atau "LSTM"brain.recurrent.GRU - Unit berulang yang terjaga keamanannya atau "gru"brain.FeedForward - Jaringan saraf feedforward yang sangat dapat disesuaikan dengan backpropagationbrain.Recurrent - Jaringan saraf berulang yang sangat disesuaikan dengan backpropagationJaring saraf yang berbeda melakukan hal yang berbeda dengan baik. Misalnya:
Jika Anda seorang pengembang atau jika Anda hanya peduli tentang penampilan ML API - silakan ambil bagian dan bergabung dengan komunitas W3C dan bagikan pendapat Anda atau hanya mendukung pendapat yang Anda sukai atau setujui.
Brain.js adalah perpustakaan pembelajaran mesin open source yang diadopsi secara luas di dunia Javascript. Ada beberapa alasan untuk itu, tetapi yang paling menonjol adalah kesederhanaan penggunaan sementara tidak mengorbankan kinerja . Kami ingin membuatnya juga mudah dipelajari, mudah digunakan dan berkinerja ketika datang ke standar W3C. Kami berpikir bahwa otak saat ini.js API cukup dekat dengan apa yang kami harapkan menjadi standar. Dan karena mendukung tidak memerlukan banyak usaha dan masih dapat membuat perbedaan besar merasa bebas untuk bergabung dengan kelompok komunitas W3C dan mendukung kami dengan otak. JS suka API.
Terlibat ke dalam pembelajaran mesin W3C proses standardisasi berkelanjutan di sini. Anda juga dapat bergabung dengan diskusi terbuka kami tentang standardisasi di sini.
Jika Anda memiliki masalah, baik bug atau fitur yang menurut Anda akan menguntungkan proyek Anda, beri tahu kami dan kami akan melakukan yang terbaik.
Buat masalah di sini dan ikuti templat.
Sumber untuk brain.js.org tersedia di repositori Brain.js.org. Dibangun menggunakan vue.js & bulma yang luar biasa. Kontribusi selalu diterima.
Proyek ini ada berkat semua orang yang berkontribusi. [Menyumbang].
Terima kasih untuk semua pendukung kami! [Menjadi pendukung]
Dukung proyek ini dengan menjadi sponsor. Logo Anda akan muncul di sini dengan tautan ke situs web Anda. [Menjadi sponsor]