我正在尝试对一些输入进行分类(文本分类:10,000多个示例,以及100,000多个功能)
我已经读过使用LibLinear对于这样的任务来说要快得多/内存效率更高,因此,我已经将我的LibSvm分类器移植到/ net,如下所示:
//SVM Settings
var teacher = new MulticlassSupportVectorLearning<Linear, Sparse<double>>()
{
//Using LIBLINEAR's L2-loss SVC dual for each SVM
Learner = (p) => new LinearDualCoordinateDescent<Linear, Sparse<double>>()
{
Loss = Loss.L2,
Complexity = 1,
}
};
var inputs = allTerms.Select(t => new Sparse<double>(t.Sentence.Select(s => s.Index).ToArray(), t.Sentence.Select(s => (double)s.Value).ToArray())).ToArray();
var classes = allTerms.Select(t => t.Class).ToArray();
//Train the model
var model = teacher.Learn(inputs, classes);
在.Learn()
点 - 我得到了一个OutOfMemoryExcpetion
。
我已经看到文档中有CacheSize
设置,但是,我无法找到可以降低此设置的位置,如许多示例中所示。
一个可能的原因 - 我使用'Hash trick'而不是索引 - 是Accord.Net尝试分配完整哈希空间的数组? (可能接近int.MaxValue)如果是这样 - 有什么办法可以避免这种情况吗?
非常感谢任何帮助!
答案 0 :(得分:1)
分配具有100000多个功能的10000多个文档的哈希空间将占用至少4 GB的内存,这可能受AppDomain memory limit和CLR对象大小限制的限制。默认情况下,许多项目都倾向于在32位平台下构建,这不允许分配超过2GB的对象。我已经设法通过删除32位平台偏好来克服这个问题(转到项目属性 - &gt;构建并取消选中“首选32位”)。之后,我们应该允许创建超过2 GB或更多内存的对象,将此行添加到配置文件
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
请注意,如果您添加此行但保留32位平台构建首选项,您仍会遇到异常,因为您的项目将无法分配此类大小的数组
这是你调整CacheSize
的方法//SVM Settings
var teacher = new MulticlassSupportVectorLearning<Linear, Sparse<double>>()
{
Learner = (p) => new SequentialMinimalOptimization<Linear, Sparse<double>>()
{
CacheSize = 1000
Complexity = 1,
}
};
var inputs = allTerms.Select(t => new Sparse<double>(t.Sentence.Select(s => s.Index).ToArray(), t.Sentence.Select(s => (double)s.Value).ToArray())).ToArray();
var classes = allTerms.Select(t => t.Class).ToArray();
//Train the model
var model = teacher.Learn(inputs, classes);
这种构建SVM的方法可以处理Sparse<double>
数据结构,但它不使用LibLinear。如果您打开Accord.NET存储库并查看使用LibLinear支持(LinearCoordinateDescent,LinearNewtonMethod)的SVM求解算法,您将看不到CacheSize属性。