2016-03-19 10 views
5

Próbuję użyć convnetjs, aby Node.js uczyć się z rzędu liczb w koordynatach x,y. Celem jest przewidzenie następnej wartości w prostym wierszu liczb.Jak dogłębnie nauczyć się z rzędu liczb przy użyciu Node.js i convnetjs i przewidzieć nową wartość?

Przede wszystkim bardzo prosty wiersz [0,1,0,2,0,3,0,4,0,5,0,6] może późniejszy sin i cos numer wiersza.

Nie chcę zagłębić się w głęboką materię edukacyjną, więc używam convnetjs.

Do tej pory próbowałem:

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

Aby zrealizować uczenie Chcę przewidzieć następną wartość, ale zastanawiam się (wiedząc, następna wartość [9]), jak powiedzieć z Trenera Zrobił źle, dobry czy bardzo dobra robota?

Co to jest właściwy sposób szkolenia x więcej, aby przewidzieć wartość? Myślę, że to nie jest trywialne, ponieważ przewidywana wartość nie idzie w kierunku wartości 9 ^^.

+0

To powinno być zawarte w funkcji .train już inaczej szukać jeśli masz wsteczną funkcji lub coś takiego , net learn przez forwadding wartości do sieci, a następnie backwarding różnicy błędów. Jednak nie sądzę, że twój przykład danych naprawdę pasuje. Spróbuj wygenerować zestawy, które są zgodne z normalną dystrybucją, to jest to, co masz z prawdziwymi problemami głównie i dla których te narzędzia zostały opracowane i zoptymalizowane. – Walfrat

+0

czy możesz określić, w jaki sposób są twoje dane wejściowe i jaki jest oczekiwany wynik? Nie widzę relacji między instrukcją w twoim pytaniu a formatem 'my_data' – leobelizquierdo

+0

Moja_data to wiersz liczb rozpoczynający się od 0 do 10, a następnie restart na 0 i znowu i znowu. Kolejna oczekiwana wartość to 9. –

Odpowiedz

6

Należy zdefiniować dane wejściowe obszaru domeny dla danych. Następnie wykonaj kroki to:

  • Tworzenie sieci według domenie wcześniej zdefiniowanej (proszę zapoznać się z dokumentacją, aby dostroić parametr w sieci: convnetjs-doc).
  • Trenuj sieć, zapoznaj się także z convnetjs-doc w celu wyboru właściwych wartości parametrów trenera.

Poniższy przykład ilustruje sieć, zakładając, że przestrzeń domeny to 9 (sieć musi przewidzieć następną wartość dla jednego rzędu o rozmiarze 9). Używam tego samego zestawu danych do szkolenia (my_data), więc aby spełnić wymagania przestrzeni dyskowej w każdym elemencie danych, biorę tablice o rozmiarze 9 w każdym kroku procesu treningowego od my_data (używając funkcji slice) i zakładając że rzeczywistą wartością dla każdego wiersza jest następna wartość w my_data po zrobieniu tablicy o rozmiarze 9 (jeśli zmiana zestawu danych powinieneś przyjąć inne podejście do tworzenia elementów, które spełniają to samo wymaganie przestrzeni domeny).

Funkcja learn do procesu uczenia się opisaną powyżej var data = my_data.slice(i, i + d); się tablicę wielkości d (9, w tym przykładzie wykonania) z my_data zaczynając i, tak że poruszają się po zbiorze treningowym dane i biorąc plastry o wielkości 9 (w celu spełniają wymagania przestrzeni dyskowej). Następnie otrzymujemy rzeczywistą wartość dla data z tą wartością: var real_value = [my_data[i + d]];, która jest wartością obok ostatniej w data, zwróć uwagę, że ponieważ pracujemy z regression, real_value musi być LISTĄ (patrz convnetjs-doc po więcej szczegółów). Następnie tworzymy Vol classvar x = new convnetjs.Vol(data); do przechowywania danych, a na koniec ćwiczymy ustawienie netto dla rzeczywistej wartości real_value dla wcześniej utworzonego Vol classtrainer.train(x, real_value);.

Po zakończeniu procesu uczenia jesteśmy gotowi na przewidzenie pewnych wartości, wszystko co musimy zrobić, to stworzyć nowe wejście, używając Vol class i przewidzieć z wyszkoloną siecią.

Jest to kod:

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

Oto niektóre z przykładów wyjścia:

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 
Powiązane problemy