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);
成果物
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);
以上。
Author And Source
この問題について(convnet.jsの作法 その2), 我々は、より多くの情報をここで見つけました https://qiita.com/ohisama@github/items/06b49470343a6975af24著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .