GPUは、ブラウザとnode.js用のJavaScriptのNeural Networksを加速しました
brain.jsは、JavaScriptに記載されているニューラルネットワーク用のGPU加速ライブラリです。
これはハーサー/脳の継続であり、もう維持されていません。詳細
RNNTimeStep 、 LSTMTimeStep 、およびGRUTimeStepでのトレーニング用RNN 、 LSTM 、 GRUでのトレーニング用AEでのトレーニング用likelytoSVG npmでbrain.jsをインストールできる場合:
npm install brain.js < script src =" //unpkg.com/brain.js " > </ script >ブラウザ用の最新のbrain.jsをダウンロードします
Brain.js 、GPUサポートのネイティブモジュールheadless-glに依存します。ほとんどの場合、NPMからbrain.jsをインストールするだけで動作するはずです。ただし、問題が発生した場合、これは事前に構築されたバイナリがGitHubリポジトリからダウンロードできず、自分で構築する必要がある場合があります。
次の依存関係がインストールされ、最新の状態であることを確認してください。
npm rebuildaptのbuild-essentialパッケージで利用可能)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の最新バージョンでは機能しなくなりました。
brain.jsを使用してXOR関数を概算する方法を示す例を以下に示します。
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を把握する理由はありません。 ( - :それで、ここにもっと複雑で現実的な例があります:デモ:色のコントラストを認識するためにニューラルネットワークをトレーニングします。
brain.jsの例レポ
この素晴らしいスクリーンキャストを確認できます。これは、実世界のデータセットを使用して単純なニューラルネットワークをトレーニングする方法を説明します。Brain.jsを使用してブラウザでニューラルネットワークを作成する方法。
train()を使用して、トレーニングデータの配列でネットワークをトレーニングします。ネットワークはtrain()への1回の呼び出しで、すべてのデータを一括でトレーニングする必要があります。より多くのトレーニングパターンはおそらくトレーニングに時間がかかりますが、通常、新しいパターンの分類にネットワークが優れています。
トレーニングは計算的に高価なため、ネットワークをオフライン(またはワーカー)でトレーニングし、 toFunction()またはtoJSON()オプションを使用して、事前に訓練されたネットワークをWebサイトに接続する必要があります。
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があります注意:値の配列を使用する場合、任意の値を使用できますが、値は単一の入力によってニューラルネットワークで表されます。したがって、より明確な値があるほど、入力層が大きくなります。数百、数千、または数百万の浮動ポイント値がある場合、これは仕事に適したクラスではありません。また、文字列から逸脱すると、これはベータになります
直接文字列を使用した例:Brainjsを使用したHello World
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でのトレーニング用各トレーニングパターンは次のとおりです。
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 ) ;デノワーズノイズデータ:
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() 2番目の引数としてオプションのハッシュを取得します。
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
} ) ; 2つの基準のいずれかが満たされるたびに、ネットワークはトレーニングを停止します。トレーニングエラーがしきい値(デフォルト0.005 )を下回っているか、最大回数(デフォルト20000 )に達しました。
デフォルトでは、トレーニングはそれが最後までどのように行われているかを知らせることはできませんが、ネットワークの現在のトレーニングエラーに関する定期的な更新を取得するためにlog trueに設定します。トレーニングエラーは毎回減少するはずです。更新はコンソールに印刷されます。 logを関数に設定すると、この関数はコンソールに印刷する代わりに更新で呼び出されます。ただし、独自の出力で更新の値を使用する場合は、代わりに機能するようにcallbackを設定できます。
学習レートは、ネットワークがどれだけ速くトレーニングするかに影響するパラメーターです。 0から1の数です。学習率が0に近い場合、トレーニングに時間がかかります。学習率0.3 1に近い場合、より速くトレーニングされますが、トレーニング結果は局所的な最小値に制約され、新しいデータで悪いパフォーマンスを実行できます。
勢いは学習率に似ており、 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.GRUTimeStepCross Validateを使用する例は、Cross-Validate.tsにあります
train(trainingData) - > TrainingStatus train()の出力は、トレーニングがどのように進んだかについての情報のハッシュです。
{
error : 0.0039139985510105032 , // training error
iterations : 406 // training iterations
}run(input) - >予測クラスでサポート:
brain.NeuralNetworkbrain.NeuralNetworkGPU > brain.NeuralNetworkのすべての機能ですが、gpuで実行されました(webgl2、webgl1、またはcpuへのフォールバック)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() -> jsonJSONにニューラルネットワークをシリアル化します
fromJSON(json)JSONのNeural Networkを脱皮します
ネットワークがトレーニングに失敗した場合、エラーはエラーのしきい値を超えます。これは、トレーニングデータが騒がしすぎる(おそらく)、ネットワークにデータの複雑さを処理するのに十分な隠しレイヤーまたはノードがない場合、または十分な反復のためにトレーニングを受けていない場合に発生する可能性があります。
トレーニングエラーが20000回の反復後に0.4のような巨大なものである場合、ネットワークが指定されたデータを理解できないことは良い兆候です。
ネットのプロパティ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
} ) ;このパラメーターを使用すると、ニューラルネットワークが使用するアクティベーション機能を指定できます。現在、サポートされている4つのアクティベーション関数があり、シグモイドはデフォルトです。
これがテーブルです(ありがとう、ウィキペディア!)多くのアクティベーション関数を要約します - アクティベーション機能
これを使用して、ネットワーク内の隠されたレイヤーの数と各レイヤーのサイズを指定できます。たとえば、2つの隠しレイヤーが必要な場合 - 最初のレイヤーは3つのノードを使用し、2つ目は4つのノードを備えています。
hiddenLayers: [ 3 , 4 ] ;デフォルトでは、 brain.js 、入力配列のサイズに比例したサイズの1つの隠されたレイヤーを使用します。
https://www.npmjs.com/package/train-streamを使用して、データをNeuralNetworkにストリーミングします
likely const likely = require ( 'brain/likely' ) ;
const key = likely ( input , net ) ;可能性のある例を参照:簡単な文字検出
toSVG < script src = "../../src/utilities/svg.js" > </ script >Feedforwardネットワークのネットワークトポロジをレンダリングします
document . getElementById ( 'result' ) . innerHTML = brain . utilities . toSVG (
network ,
options
) ;TOSVGの例:ネットワークレンダリングを参照してください
使用されたユーザーインターフェイス: 
brain.NeuralNetworkバックプロパゲーションを備えたフィードフォワードニューラルネットワークbrain.NeuralNetworkGPUバックプロパゲーションを備えたフィードフォワードニューラルネットワーク、GPUバージョンbrain.AEバックプロポジションとGPUサポートを備えた自動エンコーダーまたは「AE」brain.recurrent.RNNTimeStepタイムステップ再発ニューラルネットワークまたは「RNN」brain.recurrent.LSTMTimeStepタイムステップ長い短期メモリニューラルネットワークまたは「LSTM」brain.recurrent.GRUTimeStepタイムステップゲート再発ユニットまたは「gru」brain.recurrent.RNN再発性ニューラルネットワークまたは「RNN」brain.recurrent.LSTM長期的なメモリニューラルネットワークまたは「LSTM」brain.recurrent.GRUゲート再発ユニットまたは「gru」brain.FeedForwardバックプロパゲーションを備えた高度にカスタマイズ可能なフィードフォワードニューラルネットワークbrain.Recurrentバックプロパゲーションを備えた高度にカスタマイズ可能な再発性ニューラルネットワーク異なるニューラルネットは異なることをうまく行います。例えば:
あなたが開発者である場合、またはML APIがどのように見えるかを気にかけている場合 - 参加してW3Cコミュニティに参加して、意見を共有するか、好きなまたは同意する意見をサポートしてください。
Brain.JSは、JavaScriptの世界で広く採用されているオープンソース機械学習ライブラリです。それにはいくつかの理由がありますが、最も注目すべきは、パフォーマンスを犠牲にしていないが、使用の単純さです。 W3C標準に関しては、簡単に使用できるようにし、使いやすく、パフォーマンスを発揮したいと考えています。現在のBrain.JS APIは、標準になると予想できるものに非常に近いと思います。そして、サポートはあまり努力する必要はなく、W3Cコミュニティグループに自由に参加し、APIのようなbrain.jsで私たちをサポートしてください。
ここでW3C機械学習継続的な標準化プロセスに参加してください。また、標準化に関するオープンディスカッションに参加することもできます。
あなたが問題を抱えている場合、あなたのプロジェクトに利益をもたらすと思われるバグまたは機能のいずれかが私たちに知らせてください、そして私たちは最善を尽くします。
ここで問題を作成し、テンプレートに従ってください。
Source for brain.js.org 、brain.js.orgリポジトリで入手できます。 Awesome vue.js & bulmaを使用して構築されました。貢献はいつでも大歓迎です。
このプロジェクトは、貢献するすべての人々のおかげで存在します。 [貢献する]。
すべての支援者に感謝します! [支援者になる]
スポンサーになることにより、このプロジェクトをサポートします。あなたのロゴは、あなたのウェブサイトへのリンクでここに表示されます。 [スポンサーになる]