如何使用Node.js和convnetjs从一排数字深入学习,并预测一个新的价值?
我尝试使用convnetjs来使Node.js从x,y
坐标中的一行数字中学习。 目标是在一个简单的数字行中预测下一个值。
首先一个非常简单的行[0,1,0,2,0,3,0,4,0,5,0,6]
也许后面的sin
和cos
号码行。
我不想深入深入的学习材料,所以我使用的是convnetjs。
到目前为止我尝试过:
var convnetjs = require("./convnet-min.js"); // create a net out of it var net = new convnetjs.Net(); var layer_defs = []; layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:1}); layer_defs.push({type:'fc', num_neurons:5, activation:'sigmoid'}); layer_defs.push({type:'regression', num_neurons:1}); var net = new convnetjs.Net(); net.makeLayers(layer_defs); var my_data = [ 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8 ]; var x = new convnetjs.Vol(my_data); var trainer = new convnetjs.SGDTrainer(net, {learning_rate:1.1, momentum:0.0, batch_size:1, l2_decay:0.001}); var think = function () { for (var i = 0; i < my_data.length; i++) { xw[i] = my_data[i]; // Vol.w is just a list, it holds your data trainer.train(x, my_data[i]); } } for (var i = 0; i < 100; i++) { think(); var predicted_values = net.forward(x); console.log('predicted value: ' + predicted_values.w[0]); }
为了实现学习,我想预测下一个价值,但是我想知道(如何知道下一个价值[9])如何告诉教练他做了一个糟糕的,好的或者非常好的工作?
这是训练x
更多预测价值的正确方法吗? 我想这不是微不足道的,因为预测值不会变成价值的方向。
您需要为数据定义一个域空间input。 之后,按照这个步骤:
- 根据之前定义的域创build一个networking(请阅读本文档以调整networking中的参数: convnetjs-doc )。
- 对networking进行培训,也请按照select合适的教练员参数值的顺序参考convnetjs-doc 。
下面的例子显示了一个networking,假设域空间是9(networking必须预测大小为9的一行的下一个值)。 我正在使用相同的数据集进行训练( my_data
),所以为了满足每个数据项中的域空间要求,我正在从my_data
(使用slice
函数)在训练过程的每个步骤中采用大小为9的数组,并假设在my_data
大小为9的数组之后(如果数据集更改,您应采取不同的方法来创build满足相同域空间要求的项),则每行的实际值是my_data
的下一个值。
函数learn
做上面描述的学习过程, var data = my_data.slice(i, i + d);
从my_data
开始的my_data
取一个大小为d
的数组(9,在这个例子中),所以我们正在通过数据训练集,并采取大小为9的切片(以满足域空间要求)。 之后,我们通过以下方式获得data
的实际值: var real_value = [my_data[i + d]];
这是data
最后一个值,请注意,由于我们正在使用regression
因此real_value必须是LIST(有关更多详细信息,请参阅convnetjs-doc )。 然后我们创build一个Vol类 var x = new convnetjs.Vol(data);
存储数据,最后我们训练networking设置以前创build的Vol class trainer.train(x, real_value);
的实际值real_value
trainer.train(x, real_value);
。
当我们完成学习过程时,我们准备好预测一些值,我们所要做的就是创build一个新的input,使用一个Vol类,并用训练的networking进行预测。
这是代码:
var convnetjs = require('convnetjs'); // create a net out of it var net = new convnetjs.Net(); var d = 9; var layer_defs = []; layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:d}); layer_defs.push({type:'fc', num_neurons:10, activation:'sigmoid'}); layer_defs.push({type:'regression', num_neurons:1}); var net = new convnetjs.Net(); net.makeLayers(layer_defs); var my_data = [ 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8,9,10, 0,1,2,3,4,5,6,7,8 ]; var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.2, batch_size:1, l2_decay:0.001}); var learn = function () { for(var j = 0; j < 100; j++){ for (var i = 0; i < my_data.length - d; i++) { var data = my_data.slice(i, i + d); var real_value = [my_data[i + d]]; var x = new convnetjs.Vol(data); trainer.train(x, real_value); var predicted_values = net.forward(x); console.log("data: [" + data + "] -> value: " + real_value); console.log("prediction in learn stage is: " + predicted_values.w[0]); } } } var predict = function(data){ var x = new convnetjs.Vol(data); var predicted_value = net.forward(x); return predicted_value.w[0]; } learn(); var item = [0,1,2,3,4,5,6,7,8]; console.log("predicted value for [" + item + "] is: " + predict(item));
这些是一些示例输出:
predicted value for [3,4,5,6,7,8,9,10,0] is: 1.0789064579041727 predicted value for [0,1,2,3,4,5,6,7,8] is: 9.223386915148865 predicted value for [10,0,1,2,3,4,5,6,7] is: 8.430232430080627 predicted value for [1,2,3,4,5,6,7,8,9] is: 9.020852169040044 predicted value for [5,6,7,8,9,10,0,1,2] is: 3.0623065881421674 predicted value for [4,5,6,7,8,9,10,0,1] is: 2.208646113846295