2016-03-19 11 views
5

Node.js x,y koordinatlarındaki bir sayı satırından öğrenmek için convnetjs kullanmayı denerim. Amaç, basit bir sayı satırında bir sonraki değeri tahmin etmektir.Node.js ve convnetjs kullanarak bir dizi sayıdan nasıl derinden öğrenilir ve yeni bir değer tahmin edilir?

Her şeyden önce çok basit bir satır [0,1,0,2,0,3,0,4,0,5,0,6] belki daha sonra sin ve cos sayı satırı.

Derin öğrenme matrisine derinden gitmek istemiyorum, bu yüzden convnetjs kullanıyorum.

Şimdiye kadar denedim:

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

sonraki değerini tahmin etmek istiyorum, ama nasıl o kötü yaptığını eğitmen söylemek, iyi (bir sonraki değeri [9] bilerek) acaba öğrenmeyi gerçekleştirmek ya da çok iyi bir iş mi?

Bir değeri tahmin etmek için x1 treninin bu doğru yolu nedir? Tahminimce bu değer önemsiz değil çünkü tahmin edilen değer 9 ^^ yönüne girmiyor.

+0

zaten aksi arama

Bu

kodudur , net net değerlerini almak ve daha sonra diferansiyel hatayı geri yönlendirerek öğrenin. Ancak, veri örneğinizin gerçekten uygun olduğunu düşünmüyorum. Normal dağılımı takip eden setler oluşturmaya çalışın, esas olarak asıl sorunlarınız var ve bu araç ne için geliştirildi ve optimize edildi. – Walfrat

+0

Giriş verilerinizin nasıl olduğunu ve çıkışın ne kadar beklendiğini belirtebilir misiniz? Sorunuzdaki ifadeyle "my_data" biçimindeki ilişkiyi görmüyorum. – leobelizquierdo

+0

My_data, 0'dan 10'a kadar başlayan ve 0'dan sonra tekrar tekrar başlayan bir sayı satırıdır. Beklediğim bir sonraki varsayılan değer 9'dur. –

cevap

6

Verileriniz için bir etki alanı alanı tanımlamanız gerekir. Bu izledikten sonra bu adımları:

  • önceden tanımlanmış etki alanına göre bir ağ oluşturma (ayarlamak için ağda parametresini bu belgeleri okuyun: convnetjs-doc).
  • Ağı eğitin, eğiticinin parametreleri için doğru değerleri seçerken lütfen convnetjs-doc'a bakın.

Aşağıdaki örnekte, etki alanı boşluğunun 9 olduğunu kabul eden bir ağ gösterilmektedir (ağ, 9 numaralı bir satır için bir sonraki değeri tahmin etmelidir). Eğitim için aynı veri kümesini kullanıyorum (my_data), böylece her veri öğesindeki alan boşluğu gereksinimini karşılamak için my_data (slice işlevini kullanarak) eğitim sürecindeki her adımda 9 beden dizileri alıyorum ve varsayarak her satırın gerçek değeri, 9 numaralı bir dizi aldıktan sonra my_data'daki sonraki değerdir (veri kümesi değiştiğinde, aynı etki alanı gereksinimini karşılayan öğeler oluşturmak için farklı bir yaklaşım kullanmalısınız).

learn, yukarıda tarif edilen bir öğrenme işlemi yapmak fonksiyonu var data = my_data.slice(i, i + d);i başlayarak my_data den (bu örnekte 9) boyut d bir dizi almak, bu yüzden veri eğitim setinin boyunca hareket eden ve (9 numara dilimleri alıyor etki alanı gereksinimini karşılar. Bundan sonra data için gerçek değeri data ile en son olan var real_value = [my_data[i + d]]; değerini aldık, regression ile çalıştığımız için real_value LIST olmalıdır (daha fazla ayrıntı için bkz. convnetjs-doc). Daha sonra verileri saklamak için bir Vol classvar x = new convnetjs.Vol(data); oluşturuyoruz ve son olarak, daha önce oluşturulmuş için net ayarını real_value gerçek değerini eğitiyoruz.

Öğrenme sürecini bitirdiğimizde bazı değerleri tahmin etmeye hazırız, tek yapmamız gereken Vol class kullanarak yeni bir girdi oluşturmak ve eğitimli ağı öngörmektir.

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

Bunlar bazı örnek çıkışı vardır: Böyle bir geriye işlev ya da bir şey varsa, bu .train fonksiyonu dahil edilmelidir

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 
İlgili konular