- ×
A flexible neural network library
Filed under dataA flexible neural network library for Node.js and the browser. Check out a live demo of a movie recommendation engine built with Mind.
Features
- Vectorized - uses a matrix implementation to process training data
- Configurable - allows you to customize the network topology
- Pluggable - download/upload minds that have already learned
Installation
$ yarn add node-mind
Usage
const Mind = require('node-mind'); /** * Letters. * * - Imagine these # and . represent black and white pixels. */ const a = character( '.#####.' + '#.....#' + '#.....#' + '#######' + '#.....#' + '#.....#' + '#.....#' ) const b = character( '######.' + '#.....#' + '#.....#' + '######.' + '#.....#' + '#.....#' + '######.' ) const c = character( '#######' + '#......' + '#......' + '#......' + '#......' + '#......' + '#######' ) /** * Learn the letters A through C. */ const mind = new Mind({ activator: 'sigmoid' }) .learn([ { input: a, output: map('a') }, { input: b, output: map('b') }, { input: c, output: map('c') } ]) /** * Predict the letter C, even with a pixel off. */ const result = mind.predict(character( '#######' + '#......' + '#......' + '#......' + '#......' + '##.....' + '#######' )) console.log(result) // ~ 0.5 /** * Turn the # into 1s and . into 0s. */ function character(string) { return string .trim() .split('') .map(integer) function integer(symbol) { if ('#' === symbol) return 1 if ('.' === symbol) return 0 } } /** * Map letter to a number. */ function map(letter) { if (letter === 'a') return [ 0.1 ] if (letter === 'b') return [ 0.3 ] if (letter === 'c') return [ 0.5 ] return 0 }
Plugins
Use plugins created by the Mind community to configure pre-trained networks that can go straight to making predictions.
Here's a cool example of the way you could use a hypothetical
mind-ocr
plugin:const Mind = require('node-mind') const ocr = require('mind-ocr') const mind = Mind() .upload(ocr) .predict( '.#####.' + '#.....#' + '#.....#' + '#######' + '#.....#' + '#.....#' + '#.....#' )
To create a plugin, simply call
download
on your trained mind:const Mind = require('node-mind') const mind = Mind() .learn([ { input: [0, 0], output: [ 0 ] }, { input: [0, 1], output: [ 1 ] }, { input: [1, 0], output: [ 1 ] }, { input: [1, 1], output: [ 0 ] } ]); const xor = mind.download()
Here's a list of available plugins:
API
Mind(options)
Create a new instance of Mind that can learn to make predictions.
The available options are:
activator
: the activation function to use,sigmoid
orhtan
learningRate
: the speed at which the network will learnhiddenUnits
: the number of units in the hidden layer/siterations
: the number of iterations to runhiddenLayers
: the number of hidden layers
.learn()
Learn from training data:
mind.learn([ { input: [0, 0], output: [ 0 ] }, { input: [0, 1], output: [ 1 ] }, { input: [1, 0], output: [ 1 ] }, { input: [1, 1], output: [ 0 ] } ])
.predict()
Make a prediction:
mind.predict([0, 1])
.download()
Download a mind:
const xor = mind.download()
.upload()
Upload a mind:
mind.upload(xor)
.on()
Listen for the 'data' event, which is fired with each iteration:
mind.on('data', (iteration, errors, results) => { // ... })
Releasing / Publishing
CircleCI will handle publishing to npm. To cut a new release, just do:
$ git changelog --tag <version> $ vim package.json # enter <version> $ git release <version>
Where
<version>
follows the semver spec.Note
If you're interested in learning more, I wrote a blog post on how to build your own neural network:
Also, here are some fantastic libraries you can check out:
License
stevenmiller888.github.io · GitHub @stevenmiller888 · Twitter @stevenmiller888