convnet.jsの作法 その2


概要

convnet.jsの作法を調べる。

convnetjs.Net()

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

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は、回帰は1、分類は、0,1なら2、0,1,2なら3。
one_hot関数、argmax関数は、無い。

隠れ層

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

activation

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

調査したコード

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);


成果物

以上。