我看到的所有神经网络示例都是针对固定输入集合设计的,这在处理图像和固定长度数据时效果很好。但如何处理变长数据,例如句子、查询或源代码呢?是否有一种方法将变长数据编码为固定长度的输入,并仍然获得神经网络的泛化性能?
我看到的所有神经网络示例都是针对固定输入集合设计的,这在处理图像和固定长度数据时效果很好。但如何处理变长数据,例如句子、查询或源代码呢?是否有一种方法将变长数据编码为固定长度的输入,并仍然获得神经网络的泛化性能?
我曾经遇到过这个问题。ANN是为固定的特征向量长度而设计的,许多其他分类器如KNN、SVM、贝叶斯等也是如此。即输入层应该定义明确,不应该变化,这是一个设计问题。然而,一些研究人员选择添加零来填补缺失的间隙,我个人认为这不是一个好的解决方案,因为那些零(虚构值)将影响网络收敛到的权重。此外,可能会有以零结尾的真实信号。
ANN并不是唯一的分类器,还有更好的方法,例如随机森林。这种分类器被认为是研究人员中最好的,它使用少量的随机特征,使用自助法和装袋法创建数百个决策树,这可能效果很好,所选特征的数量通常是特征向量大小的平方根,这些特征是随机的。每个决策树都会收敛到一个解决方案,使用多数规则选择最可能的类别。
另一个解决方案是使用动态时间规整DTW,或者更好的方法是使用隐马尔可夫模型HMM。
另一个解决方案是插值,将所有小信号插值(补偿缺失值)到与最大信号相同的大小,插值方法包括但不限于平均值、B样条、三次函数等。
另一个解决方案是使用特征提取方法来使用最佳特征(最具有区分性),这次使它们具有固定的大小,这些方法包括PCA、LDA等。
另一个解决方案是使用特征选择(通常在特征提取之后),一种简单的选择给出最佳准确性的最佳特征的方法。
现在就这些了,如果以上方法都无法解决您的问题,请与我联系。
一些问题可以通过循环神经网络来解决。 例如,它非常适合在一系列输入上计算奇偶校验。
用于计算奇偶校验的循环神经网络只需要一个输入特征。 比特可以随着时间被输入。其输出也被反馈回隐藏层。 这使得学习奇偶性只需两个隐藏单元。
普通的前馈两层神经网络需要2 ** sequence_length个隐藏单元来表示奇偶校验。这个限制对于任何仅有2层(例如SVM)的架构都是成立的。
我想,一种方法是在输入中添加时间组件(循环神经网络),并将输入分块流式传输到网络中(基本上创建了神经网络的词法分析器和解析器等效物)。这将允许输入相当大,但缺点是可能没有停止符来将不同的输入序列从彼此分开(句子中的句号等效物)。
我不是完全确定,但我建议使用最大数量的输入(例如对于单词,假设没有单词超过45个字符(根据维基百科中发现的最长单词),如果遇到较短的单词,则将其他输入设置为空格字符。
或者对于二进制数据,将其设置为0。这种方法唯一的问题是如果填充了空格字符/零/任何东西的输入与有效的完整长度输入碰撞(对于数字不太问题,但对于单词可能会出现)。