Brain.js NaN训练结果

时间:2019-04-17 09:22:35

标签: javascript node.js neural-network brain.js

我正在尝试训练一个网络,该网络的输入采用包含某些预定义值的特定字符串,稍后我将从数据库或JSON中提取这些预定义值。 我通过将每个字符的ACII值除以1000来归一化数据,这使我得到了输入字符串每个字符的0到1之间的值数组。错误是,当我开始训练时,出现训练错误:NaN,奇怪的是,如果我只有一个输入,它就会起作用,下面是代码。

var brain = require('brain.js');

function normalize(string){
  var input = [];
  for(let i=0; i<string.length; i++){
    input.push(string.charCodeAt(i)/1000);
  }
  return input;
}

function convert_ascii(ascii){
  var string = '';
  for(let i=0; i<ascii.length;i++){
    string += String.fromCharCode(ascii[i]*1000);
  }
  return string;
}

var string1 = normalize('Invoice Number IN-7688998788963');
var string2 = normalize('Invoice Date April 19, 2019');
var string3 =  normalize('Due Date May 3, 2019');
var string4 = normalize('Total Due $104.50');
var string5 = normalize('Sub Total $95.00');
var string6 = normalize('Tax $9.50');
const net = new brain.NeuralNetwork();
net.train([
  { input: string1, output: { invoice_num: 1 } },
  { input: string2, output: { date: 1 } },
  { input: string3, output: { due_date: 1 } },
  { input: string4, output: { total_due: 1 } },
  { input: string5, output: { sub_total: 1 } },
  { input: string6, output: { tax: 1 } }
], {
  log: detail => console.log(detail), iterations: 1500
});

let output = net.run(normalize('Invoice Number 1241341'));

console.log(output);

下面的代码有效:

var brain = require('brain.js');

function normalize(string){
  var input = [];
  for(let i=0; i<string.length; i++){
    input.push(string.charCodeAt(i)/1000);
  }
  return input;
}

function convert_ascii(ascii){
  var string = '';
  for(let i=0; i<ascii.length;i++){
    string += String.fromCharCode(ascii[i]*1000);
  }
  return string;
}

var string1 = normalize('Invoice Number IN-7688998788963');
var string2 = normalize('Invoice Date April 19, 2019');
var string3 =  normalize('Due Date May 3, 2019');
var string4 = normalize('Total Due $104.50');
var string5 = normalize('Sub Total $95.00');
var string6 = normalize('Tax $9.50');
const net = new brain.NeuralNetwork();
net.train([
  { input: string1, output: { invoice_num: 1 } }
], {
  log: detail => console.log(detail), iterations: 1500
});

let output = net.run(normalize('Invoice Number 1241341'));

console.log(output);

2 个答案:

答案 0 :(得分:0)

您曾经解决过NaN问题吗?训练后,我在net.biases,net.changes,net.deltas等中得到了相同的结果。跑步后,我总是得到NaN。

我将字符串转换为数字,然后缓冲数组以使其长度相同。我已经看到了一些示例,其中文本(作为对象键值)直接发送到了火车上,但是当我离开给出的示例并尝试使用自己的数据NaN时。

有趣的是,在第二个示例中,您将标题包括在标准化字符串中,而不仅仅是数据值。这对事物有什么影响?

我意识到这是前一段时间,从那时起您可能已经前进了,但是也许您可以在我发疯之前阐明一些观点并朝着正确的方向推动我:-)

答案 1 :(得分:0)

我认为这与NeuralNetwork对象有关,仅当所有神经元的长度相同时才接受输入。我认为我看到的字符串输入示例使用LSTM(),所以...

我更改了:

const net = new brain.NeuralNetwork()
net.train(/* your input / config here */)

收件人:

const net = new brain.recurrent.LSTM()
const train = net.train(/* your input / config here */)
console.log(train)

每次迭代都会给我一个训练错误,并记录下来:

{error: 0.011269339231430813, iterations: 150}