convnet.jsの作法 その２

#概要

convnet.jsの作法を調べる。

#convnetjs.Net()

ネットワークを作る。
newして、レイヤーを重ねて、makelayerする。
以下のコードで、入力層７８４ニューロン、出力層７８４ニューロン、隠れ層３２ニューロンのネットができる。


```
var layer_defs, 
    net, 
    trainer;
layer_defs = [];
layer_defs.push({
    type: 'input', 
    out_sx: 28, 
    out_sy: 28, 
    out_depth: 1
});
layer_defs.push({
    type: 'fc', 
    num_neurons: 32,
    activation: 'tahn'
});
layer_defs.push({
    type: 'regression', 
    num_neurons: 28 * 28
});
net = new convnetjs.Net();
net.makeLayers(layer_defs);
```

#回帰と分類

最終レイヤーが、regressionなら回帰、softmaxなら分類。
num_neuronsは、回帰は１、分類は、０，１なら２、０，１，２なら３。
one_hot関数、argmax関数は、無い。


#隠れ層

レイヤーは、fcなら全結合。convとpoolがある。

#activation

活性化関数
それぞれ、relu, tanh, sigmoid, maxout, dropoutがある。

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/0ec7d3f9-380b-aff6-9f51-20f3c7e05219.png)

#調査したコード

```
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function draw(data, c) {
    ctx.beginPath();
	var hc = 200;
    if (c == 0) ctx.strokeStyle = "#f00";
    if (c == 1) ctx.strokeStyle = "#0f0";
    if (c == 2) ctx.strokeStyle = "#00f";
    if (c == 3) ctx.strokeStyle = "#ff0";
    if (c == 4) ctx.strokeStyle = "#f0f";
    if (c == 5) ctx.strokeStyle = "#0ff";
    ctx.lineWidth = 1;
	ctx.moveTo(0, hc);
    for (var i = 1; i < 200; i++) 
    {
        ctx.lineTo(i * 2, hc - data[i] * 100);
    }
	ctx.stroke();
}
var net = new convnetjs.Net();
var data = [];
var i;
var layer_defs = [];

layer_defs = [];
layer_defs.push({
	type: 'input',
	out_sx: 1,
	out_sy: 1,
	out_depth: 1
});
layer_defs.push({
	type: 'dropout',
	num_neurons: 1
});
net.makeLayers(layer_defs);
data = [];
for (i = 0; i < 200; i++)
{
    var f = -2 + i / 50;
    var x = new convnetjs.Vol([f]);
	var test = net.forward(x);
    data.push(test.w);
}
draw(data, 0);


layer_defs = [];
layer_defs.push({
	type: 'input',
	out_sx: 1,
	out_sy: 1,
	out_depth: 1
});
layer_defs.push({
	type: 'maxout',
	num_neurons: 1
});
net.makeLayers(layer_defs);
data = [];
for (i = 0; i < 200; i++)
{
    var f = -2 + i / 50;
    var x = new convnetjs.Vol([f]);
	var test = net.forward(x);
    data.push(test.w);
}
draw(data, 1);


layer_defs = [];
layer_defs.push({
	type: 'input',
	out_sx: 1,
	out_sy: 1,
	out_depth: 1
});
layer_defs.push({
	type: 'relu',
	num_neurons: 1
});
net.makeLayers(layer_defs);
data = [];
for (i = 0; i < 200; i++)
{
    var f = -2 + i / 50;
    var x = new convnetjs.Vol([f]);
	var test = net.forward(x);
    data.push(test.w);
}
draw(data, 2);


layer_defs = [];
layer_defs.push({
	type: 'input',
	out_sx: 1,
	out_sy: 1,
	out_depth: 1
});
layer_defs.push({
	type: 'tanh',
	num_neurons: 1
});
net.makeLayers(layer_defs);
data = [];
for (i = 0; i < 200; i++)
{
    var f = -2 + i / 50;
    var x = new convnetjs.Vol([f]);
	var test = net.forward(x);
    data.push(test.w);
}
draw(data, 3);


layer_defs = [];
layer_defs.push({
	type: 'input',
	out_sx: 1,
	out_sy: 1,
	out_depth: 1
});
layer_defs.push({
	type: 'sigmoid',
	num_neurons: 1
});
net.makeLayers(layer_defs);
data = [];
for (i = 0; i < 200; i++)
{
    var f = -2 + i / 50;
    var x = new convnetjs.Vol([f]);
	var test = net.forward(x);
    data.push(test.w);
}
draw(data, 4);


```

#成果物

http://jsdo.it/ohisama1/grAh


以上。