JavaScripting

The definitive source of the best
JavaScript libraries, frameworks, and plugins.


  • ×

    A flexible neural network library
    Filed under 

    • 🔾38%Overall
    • 1,506
    • 46.5 days
    • 🕩125
    • 👥7

    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

    Show All