ConvnetJS源代码分析第二篇(补充)

截止到前面两篇,我们已经分析了600多行的JavaScript代码,但所涉及的知识仅仅是基本的JS语法,使用最多的就是类的概念。由于在src中还有很多的关于各种类型Layers的定义,但是他们的代码基本是大同小异,就不在一一赘述所有Layer文件的代码了。

这篇关于Layer的补续将会分析convnet_layers_nonlinearities.js。为什么单单拿出这个文件分析呢?

 因为这个文件里定义了激活函数层,这是作者组织代码的高明之处。因为神经网络的层虽然变化的花样很多,但是即基于的组件是用一个公共的属性的。还记得第二篇的分析FullyConnLayer时,当时注释的其中的forword和backword中并没有激活函数的身影。作者是把连接层和激活函数层的变换层分开的。通过查看convnet_net.js(下一篇会详细分析),可以发现他为每一个层如果active function定义了,比如(Relu,Sigmoid等),他会在加上一层非线性层,也就是在这个文件中定义的。如果没有定义,就没有变换或者激活函数说其为线性。

我们可以取convnet_layers_nonlinearities.js关于SigmoidLayer代码验证上面的观点。代码的结构还是和全连接是一样的,但是其forward和backward仅仅是一个函数变化。

 // Implements Sigmoid nnonlinearity elementwise
  // x -> 1/(1+e^(-x))
  // so the output is between 0 and 1.
  var SigmoidLayer = function(opt) {
    var opt = opt || {};

    // computed
    this.out_sx = opt.in_sx;
    this.out_sy = opt.in_sy;
    this.out_depth = opt.in_depth;
    this.layer_type = 'sigmoid';
  }
  SigmoidLayer.prototype = {
    forward: function(V, is_training) {
      this.in_act = V;
      var V2 = V.cloneAndZero();
      var N = V.w.length;
      var V2w = V2.w;
      var Vw = V.w;
      for(var i=0;i<N;i++) { 
        V2w[i] = 1.0/(1.0+Math.exp(-Vw[i]));
      }
      this.out_act = V2;
      return this.out_act;
    },// 这里的in_act 和out_act的变化仅仅是一个函数变化。
    backward: function() {
      var V = this.in_act; // we need to set dw of this
      var V2 = this.out_act;
      var N = V.w.length;
      V.dw = global.zeros(N); // zero out gradient wrt data
      for(var i=0;i<N;i++) {
        var v2wi = V2.w[i];
        V.dw[i] =  v2wi * (1.0 - v2wi) * V2.dw[i];
      }
    },
    getParamsAndGrads: function() {
      return [];
    },
    toJSON: function() {
      var json = {};
      json.out_depth = this.out_depth;
      json.out_sx = this.out_sx;
      json.out_sy = this.out_sy;
      json.layer_type = this.layer_type;
      return json;
    },
    fromJSON: function(json) {
      this.out_depth = json.out_depth;
      this.out_sx = json.out_sx;
      this.out_sy = json.out_sy;
      this.layer_type = json.layer_type; 
    }
  }

接下来的一篇,我们将会分析将这些layer组合在一起的net类,其定义文件在convnet_net.js中。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值