-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Description
Following on the other issue I created #108 , I'm trying to teach an LSTM network to write a simple children's book. I'm getting odd behavior but really don't know what I'm doing to begin with. I'd love to get this example working and added to the readme for others to follow but am hitting lots of little roadblocks. Here's my code:
const brain = require('brain.js');
const words = new Map();
words.set('00001', 'Jane');
words.set('00010', 'Spot');
words.set('00100', 'Doug');
words.set('01000', 'saw');
words.set('10000', '.');
const trainingData = [
{input: [0,0,0,0,1], output: [0,1,0,0,0]},// Jane -> saw
{input: [0,0,0,1,0], output: [0,1,0,0,0]},// Spot -> saw
{input: [0,0,1,0,0], output: [0,1,0,0,0]},// Doug -> saw
{input: [0,1,0,0,0], output: [0,0,1,0,0]},// saw -> Doug
{input: [0,1,0,0,0], output: [0,0,0,1,0]},// saw -> Spot
{input: [0,1,0,0,0], output: [0,0,0,0,1]},// saw -> Jane
{input: [0,0,0,1,0], output: [1,0,0,0,0]},// Spot -> .
{input: [0,0,0,0,1], output: [1,0,0,0,0]},// Jane -> .
{input: [0,0,1,0,0], output: [1,0,0,0,0]},// Doug -> .
{input: [1,0,0,0,0], output: [0,0,0,0,1]},// . -> Jane
{input: [1,0,0,0,0], output: [0,0,0,1,0]},// . -> Spot
{input: [1,0,0,0,0], output: [0,0,1,0,0]},// . -> Doug
];
const lstm = new brain.recurrent.LSTM();
const result = lstm.train(trainingData);
const run1 = lstm.run([0,0,0,0,1]);// Jane
const run2 = lstm.run(run1);
const run3 = lstm.run(run2);
const run4 = lstm.run(run3);
console.log(words.get('00001'));// start with 'Jane'
console.log(words.get(run1));// saw
console.log(words.get(run2));// Jane, Doug or Spot
console.log(words.get(run3));// .
console.log(words.get(run4));// Jane, Doug or Spot
console.log('run 1:', run1, typeof run1);
console.log('run 2:', run2, typeof run2);
console.log('run 3:', run3, typeof run3);
console.log('run 4:', run4, typeof run4);
The results in the console:
Jane
.
Jane
.
Jane
run 1: 10000 string
run 2: 00001 string
run 3: 10000 string
run 4: 00001 string
some observations:
- the output of
run
is a string. I was expecting an array
It obviously isn't working as I expected. Since I can't find a good example I really have no idea what I'm doing wrong. I'm wondering if I'm training it wrong? I'm starting to think I should be giving it example sequences as input... like {input: "Jane saw Spot", output: "."}
but I can't wrap my head around how to express that as valid input.