【问题标题】:Encog Neural Net - How to structure training data?Encog Neural Net - 如何构建训练数据?
【发布时间】:2023-03-24 23:05:02
【问题描述】:

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

我该怎么做呢?我对 Encog 不太满意,因为我见过的所有示例要么是异或,要么极其复杂。

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

我不知道如何在我看过的 Encog 的“演示”中浏览所有 10,000 个句子并查找每个句子中的每个单词(用于输入并激活该输入)。)

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

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

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

【问题讨论】:

  • 什么神经网络?前馈?如果是,请改用 Elman 网络,因为它在其隐藏层中自然有过去的上下文,您正试图像在时延网络中那样人为地将其塞入输入中。请注意,尽管 Encog 仍然没有适当的 BPTT afaik。

标签: java machine-learning artificial-intelligence neural-network encog


【解决方案1】:

所以,我不知道该怎么告诉你,但这不是神经网络的工作原理。你不能只使用一个词作为输入,你也不能只是“不激活”一个输入。在一个非常基本的层面上,这是您在一个问题上运行神经网络所需要的:

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

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

如果您希望使用单词和深度学习框架,您应该将您的单词映射到现有的向量表示(我强烈推荐 glove,但 word2vec 也不错),然后继续学习该表示的顶部。


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

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

【讨论】:

  • 好的,我很抱歉过度简化我的问题...有 2 个输入...每个输入由 30 个神经元组成。单词是某个标签的机会被用作输入。因此,大多数神经元得到 0,其他神经元得到概率输入,例如 0.5、0.3 和 0.2。当我说“未激活”时,我的意思是所有神经元都设置为 0。输出层代表所有可能的标签,因此,它是 30。输出神经元中数字最高的标签就是选择。
  • 所以你是想根据两个预测做出一个更准确的预测?
  • (我不知道如何浏览所有 10,000 个句子并在我已经完成的 Encog 的“演示”中查找每个句子中的每个单词(用于输入并激活该输入)见过。)
  • @NateCook3 我只是确保我们在同一页面上。
  • 好的,我认为这是有道理的。我的词表示是该词在训练集中被标记为哪个词性的概率。大多数时候,一个词有可能被标记为 2-5 个不同的词性之一。您是说使用单词 W 的概率是标签 t1, t2, t3, ... tx 不是表示该单词实际是什么的好方法?我已经阅读了几篇使用这种策略的不同论文,其中大多数的识别率都在 90% 左右。
【解决方案2】:

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

我在 DNA 序列窗口中遇到了类似的问题。构建一个包含所有窗口的数组是不可扩展的。

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

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

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

对于每个readLine(),您可以返回上一个/当前单词的输入,并将位置推进到下一个单词。

【讨论】:

  • 在 XY 问题中忽略 X :/
  • @SlaterTyranus - 我认为解决 OP 的实际问题需要一些 Encog 知识。您可以在此处找到手册:s3.amazonaws.com/heatonresearch-books/free/…
  • 我理解 encog,但这并不能改变这是一个 XY 问题的事实。
  • @AndyThomas 那么,原始问题中的训练代码也需要更改?
  • @jonbon - 我不确定我明白你为什么这么建议。原题训练代码中使用的MLTrain接口将保持不变。大多数采用数据集的 encog API 都接受MLDataSet,而VersatileMLDataSet 实现了该接口。
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 2015-10-03
  • 2015-07-04
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2014-02-13
相关资源
最近更新 更多