LoginSignup
0
0

More than 5 years have passed since last update.

convnet.jsの作法 その2

Posted at

概要

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がある。

image

調査したコード

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


成果物

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0