Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use for neural networks (ANN) #10

Open
UniqueFool opened this issue May 29, 2016 · 6 comments
Open

Use for neural networks (ANN) #10

UniqueFool opened this issue May 29, 2016 · 6 comments

Comments

@UniqueFool
Copy link

Just a heads-up: There's recently been some discussion on reusing arrayfire-js as the back-end in the
BrainJS and Synaptic frameworks:

cazala/synaptic#70
cazala/synaptic#12

@unbornchikken
Copy link
Member

Yeah, AF.js works well for this case, but you gotta expect some serious API changes (sync -> async) because of #9.

@UniqueFool
Copy link
Author

Hi, thank you for responding - given that these refactorings are basically about implementing functional-a style interface, do you think you could provide a functional-style set of APIs in the form of map/filter and reduce that basically deal with arrays and callbacks directly ?

That would make it much easier for other ANN projects to use arrayfire in a higher-level fashion while isolating them from lower-level API changes.

For instance, here's the response from @cazala (synaptic lead developer), where he specifically stated that the changes required for adopting arrayfire would be fairly self-contained once we can access/use arrayfire in a map/reduce fashion: cazala/synaptic#70 (comment)

Thank you

@unbornchikken
Copy link
Member

@UniqueFool Please note #9. Resolving that issue will lead fundamental API changes for sure. I'm going back to this thread once the new version stabilizes, and then I can review your above suggestion.

@robertleeplummerjr
Copy link

any headway?

@unbornchikken
Copy link
Member

Unfortunately I couldn't come up with a solution in Node.js that is better (faster) than we have in the current version. ArrayFire's design could not fit very well with the Nature of Node's event queue, so it turned out, my first approach is the best that I can come up with. The good news is that already near feature complete, just check out the examples folder.

@robertleeplummerjr
Copy link

So in https://github.com/arrayfire/arrayfire-js/blob/master/examples/es6/machine-learning/ann.js#L15 I see a log of synchronous examples, for(var i = essentially. What if we inverted the logic so that we are transforming a vector, rather then a matrix? In short (taken from: gpujs/gpu.js#67 (comment))

We could implement something more like:

function relu(value) {
  return Math.max(0, value[this.thread.y][this.thread.x]);
}

function add(left, right) {
  return left[this.thread.y][this.thread.x] + right[this.thread.y][this.thread.x];
}

function multiply(left, right) {
  var sum = 0;
  for (var i=0; i<512; i++) {
    sum += left[this.thread.y][i] * right[i][this.thread.x];
  }
  return sum;
}

const gpu = GPU({ mode: 'webgl' });
const layerForward = gpu
  .addFunction(relu)
  .addFunction(add)
  .addFunction(multiply)
  .createKernel(function(weightMatrix, inputMatrix, transitionMatrix, previousOutputMatrix, biasMatrix) {
    return relu(
      add(
        add(
          multiply(
            weightMatrix,
            inputMatrix
          ),
          multiply(
            transitionMatrix,
            previousOutputMatrix
          )
        ),
        biasMatrix
      )
    );
  });

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants