如何使用Node.js和convnetjs从一排数字深入学习,并预测一个新的价值?

我尝试使用convnetjs来使Node.js从x,y坐标中的一行数字中学习。 目标是在一个简单的数字行中预测下一个值。

首先一个非常简单的行[0,1,0,2,0,3,0,4,0,5,0,6]也许后面的sincos号码行。

我不想深入深入的学习材料,所以我使用的是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 
Interesting Posts