Encog 神经网络 - 如何构建训练数据?

Encog Neural Net - How to structure training data?

我见过的每个 Encog 神经网络示例都涉及 XOR 或一些非常简单的东西。我有大约 10,000 个句子,句子中的每个单词都有某种类型的标签。输入层需要2个输入,前一个词和当前词。如果没有前一个词,那么第一个输入根本不会被激活。我需要像这样检查每个句子。每个词都取决于前一个词,所以我不能只拥有一个看起来类似于 XOR 示例的数组。此外,我真的不想将 10,000 多个句子中的所有单词加载到一个数组中,我宁愿一次扫描一个句子,一旦到达 EOF,就从头开始。

我应该怎么做?我对 Encog 不是很满意,因为我看到的所有示例要么是 XOR 要么非常复杂。

有 2 个输入...每个输入由 30 个神经元组成。单词成为某个标签的概率被用作输入。因此,大多数神经元得到 0,其他神经元得到概率输入,如 .5、.3 和 .2。当我说“未激活”时,我的意思是所有神经元都设置为 0。输出层代表所有可能的标签,因此,它是 30。输出神经元中任何一个具有最高数字的标签就是已选择。

我不确定如何在我见过的 'demos' 的 Encog 中检查所有 10,000 个句子并查找每个句子中的每个单词(用于输入并激活该输入)。 )

网络似乎是用一个包含所有训练数据的数组训练的,并且循环遍历直到网络训练完成。我想用许多不同的数组(每个句子一个数组)来训练网络,然后再次查看它们。

这种格式显然不适用于我正在做的事情:

    do {
    train.iteration();
    System.out.println(
    "Epoch #" + epoch + " Error:" + train.getError());
    epoch++;
    } while(train.getError() > 0.01);

所以,我不确定如何告诉你这个,但这不是神经网络的工作方式。你不能只使用一个词作为输入,你也不能只使用 "not activate" 作为输入。在最基本的层面上,这就是您 运行 一个问题的神经网络所需要的:

  1. 一个固定长度的输入向量(无论你输入什么,它都必须用固定长度的数字表示。向量中的每个条目都是一个数字)
  2. 一组标签(每个输入向量必须对应一个固定长度的输出向量)

一旦你有了这两个,神经网络就会对一个例子进行分类,然后自我编辑以尽可能接近标签。

如果你想使用单词和深度学习框架,你应该将你的单词映射到现有的向量表示(我强烈建议 glove, but word2vec 也很不错)然后在上面学习该代表。


在深入了解您在这里尝试的内容后,我认为问题在于您要处理 60 个输入,而不是一个。这些输入是两个词的现有预测的串联(在没有第一个词的情况下,前 30 个条目为 0)。您应该自己处理映射(应该非常简单),然后将其视为尝试用 60 个数字预测 30 个数字。

我觉得有必要告诉您,按照您解决问题的方式,您会看到糟糕的表现。在处理稀疏(主要是零)向量和如此小的数据集时,与其他方法相比,深度学习技术将表现出非常差的性能。您最好在现有数据上使用 glove + svm 或随机森林模型。

除了 BasicMLDataSet 之外,您还可以使用 MLDataSet 的其他实现。

我 运行 遇到了与 windows DNA 序列类似的问题。构建所有 windows 的数组将无法扩展。

相反,我实现了自己的 VersatileDataSource,并将其包装在 VersatileMLDataSet 中。

VersatileDataSource 只有几个方法可以实现:

public interface VersatileDataSource {
    String[] readLine();
    void rewind();
    int columnIndex(String name);
}

对于每个 readLine(),您可以 return 输入 previous/current 单词,并将位置推进到下一个单词。