2016-03-19 12 views
5

convnetjsを使って、x,y座標内の数字の行からNode.jsを学習させようとします。目標は、単純な行の次の値を予測することです。Node.jsとconvnetjsを使って数値の行から深く学び、新しい値を予測する方法?

まず第1に、非常に単純な行[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++) { 
     x.w[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を訓練してください。予測値が値9 ^^の方向に向かないので、これはそれほど簡単ではないと思います。

+0

これはすでにそう.train機能に含まれるべきで検索ネットは値をネットに書き換えてから、その差分エラーを後退させることで学習します。しかし、私はあなたのデータの例が本当にうってつけだとは思わない。正規分布に従ったセットを生成しようとすると、これは主に実際の問題と、それらのツールが開発され、最適化されたものであります。 – Walfrat

+0

あなたの入力データはどのように指定されていますか、そして出力は何でしょうか?あなたの質問にあるステートメントと 'my_data'のフォーマットとの関係はわかりません – leobelizquierdo

+0

My_dataは0から10までの数字の行で、0から何度も何度でも再スタートします。期待している次の値は9です。 –

答えて

6

データのドメイン入力を定義する必要があります。その後、次の手順を実行します。

  • 定義済みのドメインに従ってネットワークを作成します(ネットワーク上のパラメータを調整するにはこのドキュメントをお読みください)。convnetjs-doc
  • ネットワークを訓練する場合は、トレーナのパラメータの適切な値を選択する順序でconvnetjs-docを参照してください。

以下の例では、ドメインスペースが9であると仮定してネットワークを示しています(ネットワークはサイズ9の1行の次の値を予測する必要があります)。私は訓練(my_data)のために同じデータセットを使用しているので、私は各データ項目のドメイン空間要件を満たすために、my_dataslice関数を使用して)からトレーニングプロセスの各ステップでサイズ9の配列をとっており、サイズが9の配列をとった後に、各行の実際の値はmy_dataの次の値になります(データセットが変更された場合は、同じドメインスペース要件を満たすアイテムを作成するために別のアプローチをとる必要があります)。

機能learnは、上述した学習処理を行うvar data = my_data.slice(i, i + d);i始まるmy_dataからサイズd(この例では9)の配列を取るので、我々は(のデータのトレーニングセットを通って移動し、サイズ9のスライスを取っていますドメインスペース要件を満たす)。その後、dataの実際の値はvar real_value = [my_data[i + d]];で、dataの最後の値です。regressionで作業しているため、real_valueはLISTでなければなりません(詳細はconvnetjs-docを参照)。次に、データを保存するためにVol classvar x = new convnetjs.Vol(data);を作成し、最後に、以前に作成したVol classtrainer.train(x, real_value);の実際の値real_valueをネットワーク設定に訓練します。

学習プロセスが終了したら、いくつかの値を予測する準備が整いました。新しい入力を作成するには、Vol classを使用し、訓練されたネットで予測します。

これはコードです:

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 
関連する問題