我正在尝试对一些输入进行分类(文本分类: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)如果是这样 – 有什么办法可以避免这种情况吗?
任何帮助非常感谢!
解决方法
分配具有100000个功能的10000个文档的哈希空间将占用至少4 GB的内存,这可能受到
AppDomain memory limit和CLR对象大小限制的限制.默认情况下,许多项目都倾向于在32位平台下构建,这不允许分配超过2GB的对象.我已经设法通过删除32位平台偏好来克服这个问题(转到项目属性 – >构建并取消选中“首选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支持的SVM求解算法(LinearCoordinateDescent,LinearNewtonMethod),您将看不到CacheSize属性.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。