Skip to content

stevenmiller888/mind

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

69 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Mind Logo

CircleCI

A 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 or htan
  • learningRate: the speed at which the network will learn
  • hiddenUnits: the number of units in the hidden layer/s
  • iterations: the number of iterations to run
  • hiddenLayers: 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

MIT


stevenmiller888.github.io  ·  GitHub @stevenmiller888  ·  Twitter @stevenmiller888

About

A neural network library built in JavaScript

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors