我所看到的关于Encog神经网络的每一个例子都涉及到XOR或一些非常简单的东西。我有大约10,000个句子,句子中的每个单词都有一些标签。输入层需要接受两个输入,前一个字和当前字。如果没有前面的单词,那么第一个输入就根本没有激活。我需要像这样把每句话都读一遍。每个单词都取决于前面的单词,所以我不能只拥有一个类似于XOR示例的数组。此外,我真的不想把所有的单词从10,000+语句加载到一个数组中,我宁愿一次扫描一个句子,一旦到达EOF,从开始开始。
我该怎么做呢?我对Encog并不太满意,因为我看到的所有例子要么是异或的,要么是极其复杂的。
有两个输入..。每个输入由30个神经元组成。单词是一个特定的标记的机会被用作输入。因此,大多数神经元得到0,其他神经元得到概率输入,如.5、.3和.2。当我说“没有激活”时,我的意思是所有的神经元都被设置为0。输出层表示所有可能的标记,因此,它的30个。无论哪个输出神经元有最高的数目,都是被选择的标记。
我不知道如何在我见过的Encog的“演示”中,遍历所有的10,000个句子,并查找每个句子中的每个单词(输入和激活输入)。
网络似乎是由一个存储所有训练数据的阵列来训练的,并且一直循环到网络被训练为止。我想用许多不同的数组(每个句子一个数组)来训练网络,然后再看一遍它们。
显然,这种格式对我所做的工作是行不通的:
do {
train.iteration();
System.out.println(
"Epoch #" + epoch + " Error:" + train.getError());
epoch++;
} while(train.getError() > 0.01);发布于 2015-06-30 20:56:01
所以,我不知道该怎么告诉你,但这不是神经网络的工作原理。你不能仅仅用一个词作为输入,你也不能只是“不激活”一个输入。在一个非常基本的层次上,这就是在一个问题上运行一个神经网络所需要的:
一旦你有这两个,神经网络分类一个例子,然后编辑自己,以尽可能接近标签。
如果您希望使用单词和深度学习框架,则应该将您的单词映射到现有的向量表示(我强烈建议使用手套,但word2vec也不错),然后在表示的基础上学习。
在对你的尝试有了更深入的理解之后,我认为问题是,你要处理的是60个输入,而不是一个。这些输入是对两个单词的现有预测的连接(在没有第一个单词的情况下,前30个条目是0)。您应该自己处理映射(应该非常简单),然后将其视为试图预测60个数字的30个数字。
我不得不告诉你,你设计问题的方式,你会看到糟糕的表现。在处理稀疏(大部分为零)向量和这样小的数据集时,与其他方法相比,深度学习技术将显示出非常差的性能。您最好在现有数据上使用手套+ svm或随机森林模型。
发布于 2015-06-30 20:59:09
除了MLDataSet,您还可以使用BasicMLDataSet的其他实现。
我遇到了一个类似的问题,窗口的DNA序列。构建所有窗口的数组都是不可伸缩的。
相反,我实现了自己的VersatileDataSource,并将其封装在一个VersatileMLDataSet中。
VersatileDataSource只有几个实现方法:
public interface VersatileDataSource {
String[] readLine();
void rewind();
int columnIndex(String name);
}对于每个readLine(),您可以返回上一个/当前单词的输入,并将位置提升到下一个单词。
https://stackoverflow.com/questions/31148242
复制相似问题