GPU beschleunigten neuronale Netze in JavaScript für Browser und Node.js
brain.js ist eine GPU -beschleunigte Bibliothek für in JavaScript geschriebene neuronale Netze.
Dies ist eine Fortsetzung des Harthur/des Gehirns , der nicht mehr aufrechterhalten wird. Weitere Informationen
RNNTimeStep , LSTMTimeStep und GRUTimeStepRNN , LSTM und GRUAElikelytoSVG Wenn Sie brain.js mit NPM installieren können:
npm install brain.js < script src =" //unpkg.com/brain.js " > </ script >Laden Sie die neuesten Brain.js für den Browser herunter
Brain.js hängt von einem nativen Modul- headless-gl für die GPU-Unterstützung ab. In den meisten Fällen sollte die Installation brain.js von NPM nur funktionieren. Wenn Sie jedoch auf Probleme stoßen, bedeutet dies, dass vorgebaute Binärdateien nicht in Github -Repositories heruntergeladen werden können und Sie es möglicherweise selbst bauen müssen.
Bitte stellen Sie sicher, dass die folgenden Abhängigkeiten installiert und auf dem neuesten Stand sind und dann ausführen:
npm rebuildbuild-essential -Paket auf apt )sudo apt-get install -y build-essential libglew-dev libglu1-mesa-dev libxi-dev pkg-confignpm config set msvs_version 2022 Hinweis: Dies funktioniert nicht mehr in modernen Versionen von NPM.npm config set python python3 Hinweis: Dies funktioniert nicht mehr in modernen Versionen von NPM. * Wenn Sie Build Tools 2017 verwenden, führen Sie npm config set msvs_version 2017 aus: Dies funktioniert nicht mehr in modernen Versionen von NPM.
Hier ist ein Beispiel, das zeigt, wie die XOR -Funktion mit brain.js : Weitere Informationen zur Konfiguration hier annähern.
Eine unterhaltsame und praktische Einführung in 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]Oder weitere Informationen zur Konfiguration hier.
// 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]Es gibt jedoch keinen Grund, ein neuronales Netzwerk zu verwenden, um XOR herauszufinden. (-: Hier ist also ein realistischeres Beispiel: Demo: Schulung eines neuronalen Netzwerks, um den Farbkontrast zu erkennen.
Brain.js Beispiele Repo
Sie können sich diesen fantastischen Screencast ansehen, in dem erklärt wird, wie Sie ein einfaches neuronales Netzwerk mit einem realen Datensatz trainieren: So erstellen Sie mithilfe von Brain.js ein neuronales Netzwerk im Browser.
Verwenden Sie train() , um das Netzwerk mit einer Reihe von Trainingsdaten zu trainieren. Das Netzwerk muss mit allen Daten in großen Schütteln in einem Anruf bei train() geschult werden. Mehr Trainingsmuster dauern wahrscheinlich länger, um zu trainieren, führt jedoch normalerweise zu einem Netzwerk, das neue Muster besser klassifiziert.
Das Training ist rechnerisch teuer, sodass Sie versuchen sollten, das Netzwerk offline (oder bei einem Arbeiter) zu trainieren und die Optionen toFunction() oder toJSON() zu verwenden, um das vorgebrachte Netzwerk in Ihre Website zu schließen.
NeuralNetwork Jedes Trainingsmuster sollte einen input und eine output haben, die beide entweder ein Array von Zahlen von 0 bis 1 oder ein Hash von Zahlen von 0 bis 1 sein können. Für die Farbkontrastdemo sieht es ungefähr so aus:
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 }Hier ist eine weitere Variation des obigen Beispiels. ( Beachten Sie , dass Eingangsobjekte nicht ähnlich sein müssen.)
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 und GRUTimeStepJedes Trainingsmuster kann entweder:
Beispiel unter Verwendung einer Reihe von Zahlen:
const net = new brain . recurrent . LSTMTimeStep ( ) ;
net . train ( [ [ 1 , 2 , 3 ] ] ) ;
const output = net . run ( [ 1 , 2 ] ) ; // 3Beispiel unter Verwendung einer Reihe von Zahlenarrays:
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 und GRUJedes Trainingsmuster kann entweder:
input und einen output habenVORSICHT: Wenn Sie ein Array von Werten verwenden, können Sie jeden Wert verwenden. Die Werte werden jedoch im neuronalen Netzwerk durch eine einzelne Eingabe dargestellt. Die deutlicheren Werte haben also die größere Ihre Eingangsschicht . Wenn Sie über Hundert, Tausende oder Millionen von schwimmenden Punktwerten haben , ist dies nicht die richtige Klasse für den Job . Auch wenn es von Strings abweicht, gerät dies in Beta
Beispiel mit direkten Zeichenfolgen: Hallo Welt mit 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'Beispiel unter Verwendung von Zeichenfolgen mit Eingängen und Ausgängen:
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' AEJedes Trainingsmuster kann entweder:
Training eines AutoCodierers, um die Werte einer XOR -Berechnung zu komprimieren:
const net = new brain . AE (
{
hiddenLayers : [ 5 , 2 , 5 ]
}
) ;
net . train ( [
[ 0 , 0 , 0 ] ,
[ 0 , 1 , 1 ] ,
[ 1 , 0 , 1 ] ,
[ 1 , 1 , 0 ]
] ) ;Codierung/Dekodierung:
const input = [ 0 , 1 , 1 ] ;
const encoded = net . encode ( input ) ;
const decoded = net . decode ( encoded ) ;Denoise Laute Daten:
const noisyData = [ 0 , 1 , 0 ] ;
const data = net . denoise ( noisyData ) ;Test auf Anomalien in Datenproben:
const shouldBeFalse = net . includesAnomalies ( [ 0 , 1 , 1 ] ) ;
const shouldBeTrue = net . includesAnomalies ( [ 0 , 1 , 0 ] ) ; train() nimmt einen Hash von Optionen als zweites Argument an:
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
} ) ; Das Netzwerk wird das Training einstellen, wenn eines der beiden Kriterien erfüllt ist: Der Trainingsfehler ist unter den Schwellenwert (Standard 0.005 ) oder die maximale Anzahl von Iterationen (Standard 20000 ) erreicht.
In der Schulung werden Sie standardmäßig erst am Ende mitgeteilt, sondern setzen Sie log auf true , um periodische Aktualisierungen des aktuellen Trainingsfehlers des Netzwerks zu erhalten. Der Trainingsfehler sollte jedes Mal abnehmen. Die Updates werden in die Konsole gedruckt. Wenn Sie log auf eine Funktion festlegen, wird diese Funktion mit den Updates aufgerufen, anstatt in die Konsole zu drucken. Wenn Sie jedoch die Werte der Updates in Ihrer eigenen Ausgabe verwenden möchten, kann der callback auf eine Funktion eingestellt werden, um dies stattdessen zu tun.
Die Lernrate ist ein Parameter, der beeinflusst, wie schnell das Netzwerk trainiert. Es ist eine Zahl von 0 bis 1 . Wenn die Lernrate nahe bei 0 liegt, dauert es länger, dass der Training trainiert wird. Wenn die Lernrate näher an 1 liegt, trainiert sie schneller, aber die Schulungergebnisse können auf ein lokales Minimum beschränkt werden und bei neuen Daten schlecht abschneiden. ( Überanpassung ) Die Standard -Lernrate beträgt 0.3 .
Die Dynamik ähnelt der Lernrate und erwartet auch einen Wert von 0 auf 1 , wird jedoch mit dem Änderungswert des nächsten Levels multipliziert. Der Standardwert beträgt 0.1
Jede dieser Schulungsoptionen kann in den Konstruktor übergeben oder in die Methode updateTrainingOptions(opts) übergeben und im Netzwerk gespeichert und während der Trainingszeit verwendet werden. Wenn Sie Ihr Netzwerk in JSON speichern, werden diese Trainingsoptionen ebenfalls gespeichert und wiederhergestellt (mit Ausnahme von Callback und Protokoll wird Callback vergessen und das Protokoll wird mit Console.log wiederhergestellt).
Eine boolesche Eigenschaft namens invalidTrainOptsShouldThrow wird standardmäßig auf true eingestellt. Während die Option true ist, wird ein Fehler mit einer Nachricht über die abnormale Option geworfen, wenn Sie eine Trainingsoption eingeben, die außerhalb des normalen Bereichs liegt. Wenn die Option auf false festgelegt ist, wird kein Fehler gesendet, aber eine Nachricht wird weiterhin an console.warn mit den zugehörigen Informationen gesendet.
trainAsync() nimmt die gleichen Argumente wie Zug (Daten und Optionen). Anstatt das Ergebnisobjekt aus dem Training zurückzugeben, wird ein Versprechen zurückgegeben, das bei der Auflösung das Trainingsergebnisobjekt zurückgibt. Funktioniert nicht mit:
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 ) ;Mit mehreren Netzwerken können Sie parallel so trainieren:
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 ) ;Die Kreuzvalidierung kann eine weniger fragile Schulung für größere Datensätze bieten. Die API von Brain.js bietet in diesem Beispiel eine Kreuzvalidierung:
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 ) ; Verwenden Sie CrossValidate mit diesen Klassen:
brain.NeuralNetworkbrain.RNNTimeStepbrain.LSTMTimeStepbrain.GRUTimeStepEin Beispiel für die Verwendung von Querprüfungen findet sich in Cross-Validat.ts
train(trainingData) -> TrainingStatus Die Ausgabe von train() ist ein Hash von Informationen darüber, wie das Training verlaufen ist:
{
error : 0.0039139985510105032 , // training error
iterations : 406 // training iterations
}run(input) -> VorhersageUnterstützt in Klassen:
brain.NeuralNetworkbrain.NeuralNetworkGPU -> Die gesamte Funktionalität von brain.NeuralNetwork wurde jedoch auf GPU ausgeführt (über GPU.js in WebGl2, WebGl1 oder Fallback an CPU)brain.recurrent.RNNbrain.recurrent.LSTMbrain.recurrent.GRUbrain.recurrent.RNNTimeStepbrain.recurrent.LSTMTimeStepbrain.recurrent.GRUTimeStepBeispiel:
// 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) -> VorhersagenErhältlich mit den folgenden Klassen. Gibt eine Reihe von Vorhersagen aus. Vorhersagen sind eine Fortsetzung der Eingaben.
brain.recurrent.RNNTimeStepbrain.recurrent.LSTMTimeStepbrain.recurrent.GRUTimeStepBeispiel:
const net = new brain . LSTMTimeStep ( ) ;
net . fromJSON ( json ) ;
net . forecast ( input , 3 ) ;toJSON() -> jsonSerialisieren Sie neuronales Netzwerk mit JSON
fromJSON(json)Deserialisieren Sie neuronales Netzwerk von JSON
Wenn das Netzwerk nicht trainiert hat, liegt der Fehler über der Fehlerschwelle. Dies kann passieren, wenn die Trainingsdaten (höchstwahrscheinlich) zu laut sind, das Netzwerk nicht genug versteckte Schichten oder Knoten hat, um die Komplexität der Daten zu bewältigen, oder es wurde nicht für genügend Iterationen geschult.
Wenn der Trainingsfehler nach 0.4 Iterationen immer noch etwas großes ist, ist dies ein gutes Zeichen dafür, dass das Netzwerk die angegebenen Daten nicht verstehen kann.
Die Instanz der Eigenschaft des NET maxPredictionLength kann (Standard 100) eingestellt werden, um die Ausgabe des Netzes anzupassen.
Beispiel:
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' ) ; Serialisieren oder Last im Zustand eines geschulten Netzwerks mit JSON:
const json = net . toJSON ( ) ;
net . fromJSON ( json ) ; Sie können auch eine benutzerdefinierte eigenständige Funktion von einem geschulten Netzwerk erhalten, das genau wie run() wirkt:
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() nimmt einen Hash von Optionen an:
const net = new brain . NeuralNetwork ( {
activation : 'sigmoid' , // activation function
hiddenLayers : [ 4 ] ,
learningRate : 0.6 , // global learning rate, useful when training using streams
} ) ;Mit diesem Parameter können Sie angeben, welche Aktivierungsfunktion Ihr neuronales Netzwerk verwenden soll. Derzeit gibt es vier unterstützte Aktivierungsfunktionen, wobei Sigmoid der Standard ist:
Hier ist eine Tabelle (danke, Wikipedia!), Die eine Vielzahl von Aktivierungsfunktionen zusammenfasst - Aktivierungsfunktion
Sie können dies verwenden, um die Anzahl der versteckten Ebenen im Netzwerk und die Größe jeder Ebene anzugeben. Wenn Sie beispielsweise zwei versteckte Schichten wünschen - die erste mit 3 Knoten und die zweite mit 4 Knoten, würden Sie geben:
hiddenLayers: [ 3 , 4 ] ; Standardmäßig verwendet brain.js eine versteckte Schicht mit Größe proportional zur Größe des Eingangsarrays.
Verwenden Sie https://www.npmjs.com/package/train-stream, um Daten auf ein NeuralNetwork zu streamen
likely const likely = require ( 'brain/likely' ) ;
const key = likely ( input , net ) ;Wahrscheinliches Beispiel siehe: Einfache Briefkennung
toSVG < script src = "../../src/utilities/svg.js" > </ script >Rendert die Netzwerktopologie eines Feedforward -Netzwerks
document . getElementById ( 'result' ) . innerHTML = brain . utilities . toSVG (
network ,
options
) ;TOSVG -Beispiel siehe: Netzwerktrending
Die verwendete Benutzeroberfläche:
brain.NeuralNetwork - Feedforward Neural Network mit Backpropagationbrain.NeuralNetworkGPU - Feedforward Neural Network mit Backpropagation, GPU -Versionbrain.AE - Autocoder oder "AE" mit Backpropogation und GPU -Unterstützungbrain.recurrent.RNNTimeStep - Zeitschritt wiederkehrendes neuronales Netzwerk oder "RNN"brain.recurrent.LSTMTimeStep - Zeitschritt langer kurzfristiger Gedächtnis Neurales Netzwerk oder "LSTM"brain.recurrent.GRUTimeStep - Zeitschritt wiederholte rezidivierende Einheit oder "Gru"brain.recurrent.RNN - Wiederkehrendes neuronales Netzwerk oder "RNN"brain.recurrent.LSTM - Langes kurzfristiges Gedächtnis Neuronales Netzwerk oder "LSTM"brain.recurrent.GRU - Gated Recurrent Unit oder "Gru"brain.FeedForward - Hochpassbares Feedforward Neuronales Netzwerk mit Backpropagationbrain.Recurrent - hoch anpassbares wiederkehrendes neuronales Netzwerk mit BackpropagationUnterschiedliche neuronale Netze machen unterschiedliche Dinge gut. Zum Beispiel:
Wenn Sie ein Entwickler sind oder sich nur darum kümmern, wie die ML -API aussehen sollte, nehmen Sie bitte teil und teilen Sie sich der W3C -Community an und teilen Sie Ihre Meinungen oder unterstützen Sie einfach die Meinungen, mit denen Sie mögen oder mit denen Sie zustimmen.
Brain.js ist eine weit verbreitete Open -Source -Bibliothek für maschinelles Lernen in der JavaScript -Welt. Es gibt mehrere Gründe dafür, aber am bemerkenswert ist, dass die Einfachheit der Nutzung ohne die Leistung der Leistung nicht geopfert wird . Wir möchten es auch einfach zu lernen, einfach zu bedienen und leistungsfähig zu machen, wenn es um W3C -Standard geht. Wir glauben, dass die aktuelle API von Brain.js ziemlich nahe an dem ist, was wir erwarten könnten, ein Standard zu werden. Und da die Unterstützung nicht viel Aufwand erfordert und dennoch einen großen Unterschied bewirken kann, können Sie sich der W3C -Community -Gruppe anschließen und uns mit Brain.js wie API unterstützen.
Beteiligen Sie sich hier in W3C Maschinelles Lernen. Sie können sich auch unserer offenen Diskussion über die Standardisierung hier anschließen.
Wenn Sie ein Problem haben, würde entweder ein Fehler oder eine Funktion, von der Sie glauben, dass sie Ihrem Projekt zugute kommen, und wir werden unser Bestes geben.
Erstellen Sie hier Probleme und folgen Sie der Vorlage.
Quelle für brain.js.org ist unter Brain.js.org Repository erhältlich. Gebaut mit Awesome vue.js & bulma . Beiträge sind immer willkommen.
Dieses Projekt besteht dank aller Menschen, die einen Beitrag leisten. [Beitragen].
Vielen Dank an alle unsere Unterstützer! [Backer werden]
Unterstützen Sie dieses Projekt, indem Sie Sponsor werden. Ihr Logo wird hier mit einem Link zu Ihrer Website angezeigt. [Sponsor werden]