Ускоренные нейронные сети GPU в JavaScript для браузеров и Node.js
brain.js - это библиотека ускоренной графической помощи для нейронных сетей, написанных в 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. (-: Итак, вот более вовлеченный, реалистичный пример: демонстрация: обучение нейронной сети для распознавания цветового контраста.
Brain.js Примеры репо
Вы можете проверить этот фантастический Screencast, который объясняет, как обучить простую нейронную сеть, используя реальную набор данных: как создать нейронную сеть в браузере с использованием 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Каждая схема обучения может либо:
Обучение автоэкодора для сжатия значений расчета 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 ), или было достигнуто максимальное число итераций (по умолчанию 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 ) ;Перекрестная проверка может обеспечить менее хрупкий способ обучения по более крупным наборам данных. API Brain.js обеспечивает перекрестную проверку в этом примере:
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) -> Training Status Вывод train() - это хэш информации о том, как прошло обучение:
{
error : 0.0039139985510105032 , // training error
iterations : 406 // training iterations
}run(input) -> прогнозПоддерживается на занятиях:
brain.NeuralNetworkbrain.NeuralNetworkGPU -> Все функции brain.NeuralNetwork , но работали на графическом процессоре (через gpu.js в 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() -> jsonСериализовать нейронную сеть на JSON
fromJSON(json)Deserialize Neural Network от 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-stream, чтобы транслировать данные в Neuralnetwork
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 - Нейронная сеть прямой связи с обратным распространением, версия GPUbrain.AE - Autoencoder или «AE» с обратным пропогатированием и поддержкой графического процессораbrain.recurrent.RNNTimeStep - Постоянная нейронная сеть времени или «rnn» или «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. Мы думаем, что Current Brain.js API довольно близок к тому, что мы могли бы ожидать, станут стандартом. А так как поддержка не требует больших усилий и все еще может иметь огромное значение, не стесняйтесь присоединиться к группе сообщества W3C и поддерживать нас с помощью Brain.js, как API.
Примите участие в постоянном процессе стандартизации W3C. Вы также можете присоединиться к нашему открытую дискуссию о стандартизации здесь.
Если у вас есть проблема, либо ошибка, либо функция, которая, по вашему мнению, принесет пользу вашему проекту, сообщите нам об этом, и мы сделаем все возможное.
Создайте проблемы здесь и следуйте шаблону.
Источник для brain.js.org доступен в репозитории Brain.js.org. Создан с помощью Awesome vue.js & bulma . Вклад всегда приветствуются.
Этот проект существует благодаря всем людям, которые вносят свой вклад. [Способствовать].
Спасибо всем нашим покровителям! [Станьте покровителем]
Поддержите этот проект, став спонсором. Ваш логотип будет отображаться здесь со ссылкой на ваш сайт. [Станьте спонсором]