我怀疑这是由于您的训练集。这应该将某个输入映射到正确的输出。就像在 Brainjs 颜色对比示例中一样:
net.train([{input: { r: 0.03, g: 0.7, b: 0.5 }, output: { black: 1 }},
{input: { r: 0.16, g: 0.09, b: 0.2 }, output: { white: 1 }},
{input: { r: 0.5, g: 0.5, b: 1.0 }, output: { white: 1 }}]);
对于输入列表,它给出了正确的分类。然后,如果您运行经过训练的网络,它会给出您输入的类别的可能性:
var output = net.run({ r: 1, g: 0.4, b: 0 }); // { white: 0.99, black: 0.002 }
您从 wordsInOrder 创建训练集。这意味着有些词在你的训练集中出现了多次。像“制造”这样的词多次出现在您的训练集中,具有不同的输出:
made -> If (or the respective wordindex values, normalized to be between 0-1)
made -> It's
made -> outside
made -> in
经过训练的网络将尝试补偿不同的可能结果,并将其输出的可能性平均化。如果然后使用该输出在dictionaryWords
数组中查找单词,则更有可能最终得到位于数组中间的单词(例如“not”和“necessarily”)
您需要考虑到神经网络将返回输入属于某个类别的可能性。所以如果你想用它来预测下一个单词,你必须对训练数据进行不同的编码。'made' 有 4 个有效的下一个单词,因此您必须将它们编码为...
{input: { (wordindex of 'made' }, output: { if: 1, its: 1, outside:1, in:1 }}
当然,这意味着您的输出将具有dictionaryWords
数组中所有 92 个唯一单词的似然分数。我不确定这个简单的神经网络是否可以用于 92 维的输出。
您是否查看过用于生成文本的马尔可夫链?它可以更容易地模拟哪些转换(从一个单词到下一个单词)比其他转换更有可能。
这是一个解释和一个javascript实现。