神经网络的JavaScript实现:ConvNetJS

jopen 10年前

ConvNetJS是神经网络的一个JavaScript实现,可以让你在浏览器中训练深度网络。目前看来,它最重要的用途是帮助Deep Learning 初学者更快、更直观的理解算法。它当前支持:

  • 常见的神经网络模块(全连接层,非线性)
  •  分类(SVM/ SOFTMAX)和回归(L2)的成本函数
  • A MagicNet class for fully automatic neural network learning (automatic hyperparameter search and cross-validatations)
  • Ability to specify and train Convolutional Networks that process images
  • 实验强化学习模块,基于深Q学习。

示例

Interactively regress toy 1-D data

神经网络的JavaScript实现:ConvNetJS

Classify MNIST digits with a Convolutional Neural Network

神经网络的JavaScript实现:ConvNetJS

示例代码

Here's a minimum example of defining a 2-layer neural network and training it on a single data point:

// species a 2-layer neural network with one hidden layer of 20 neurons  var layer_defs = [];  // input layer declares size of input. here: 2-D data  // ConvNetJS works on 3-Dimensional volumes (sx, sy, depth), but if you're not dealing with images  // then the first two dimensions (sx, sy) will always be kept at size 1  layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:2});  // declare 20 neurons, followed by ReLU (rectified linear unit non-linearity)  layer_defs.push({type:'fc', num_neurons:20, activation:'relu'});   // declare the linear classifier on top of the previous hidden layer  layer_defs.push({type:'softmax', num_classes:10});    var net = new convnetjs.Net();  net.makeLayers(layer_defs);    // forward a random data point through the network  var x = new convnetjs.Vol([0.3, -0.5]);  var prob = net.forward(x);     // prob is a Vol. Vols have a field .w that stores the raw data, and .dw that stores gradients  console.log('probability that x is class 0: ' + prob.w[0]); // prints 0.50101    var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, l2_decay:0.001});  trainer.train(x, 0); // train the network, specifying that x is class zero    var prob2 = net.forward(x);  console.log('probability that x is class 0: ' + prob2.w[0]);  // now prints 0.50374, slightly higher than previous 0.50101: the networks  // weights have been adjusted by the Trainer to give a higher probability to  // the class we trained the network with (zero)

and here is a small Convolutional Neural Network if you wish to predict on images:

var layer_defs = [];  layer_defs.push({type:'input', out_sx:32, out_sy:32, out_depth:3}); // declare size of input  // output Vol is of size 32x32x3 here  layer_defs.push({type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'});  // the layer will perform convolution with 16 kernels, each of size 5x5.  // the input will be padded with 2 pixels on all sides to make the output Vol of the same size  // output Vol will thus be 32x32x16 at this point  layer_defs.push({type:'pool', sx:2, stride:2});  // output Vol is of size 16x16x16 here  layer_defs.push({type:'conv', sx:5, filters:20, stride:1, pad:2, activation:'relu'});  // output Vol is of size 16x16x20 here  layer_defs.push({type:'pool', sx:2, stride:2});  // output Vol is of size 8x8x20 here  layer_defs.push({type:'conv', sx:5, filters:20, stride:1, pad:2, activation:'relu'});  // output Vol is of size 8x8x20 here  layer_defs.push({type:'pool', sx:2, stride:2});  // output Vol is of size 4x4x20 here  layer_defs.push({type:'softmax', num_classes:10});  // output Vol is of size 1x1x10 here    net = new convnetjs.Net();  net.makeLayers(layer_defs);    // helpful utility for converting images into Vols is included  var x = convnetjs.img_to_vol(document.getElementById('#some_image'))  var output_probabilities_vol = net.forward(x)

项目主页:http://www.open-open.com/lib/view/home/1415288845621