您的位置:首页 > Web前端 > JavaScript

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仅仅是一个函数变化。

// 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中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息