ConvnetJS源代码分析第二篇(补充)
2016-01-28 13:42
691 查看
截止到前面两篇,我们已经分析了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仅仅是一个函数变化。
接下来的一篇,我们将会分析将这些layer组合在一起的net类,其定义文件在convnet_net.js中。
这篇关于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中。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享
- 如何创建对象以及jQuery中创建对象的方式
- 数组方法汇总