Accord.Net - LibLinear 上的 CacheSize
Posted
技术标签:
【中文标题】Accord.Net - LibLinear 上的 CacheSize【英文标题】:Accord.Net - CacheSize on LibLinear 【发布时间】:2017-11-08 03:14:45 【问题描述】:我正在尝试对一些输入进行分类(文本分类:10,000 多个示例和 100,000 多个特征)
而且我读到使用 LibLinear 对于此类任务来说速度更快/内存效率更高,因此,我已将我的 LibSvm 分类器移植到accord/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)如果是这样 - 有没有办法避免这种情况?
非常感谢任何帮助!
【问题讨论】:
你能包括完整的例子(要点)吗? 请在 Accord.NET 问题跟踪器上打开一个问题,并附上您正在尝试学习的完整示例,包括数据集(如果可能)。 【参考方案1】:分配具有 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 属性。
【讨论】:
感谢您的回答 - 一个问题 - 这在幕后使用“Liblinear”吗?还是 Libsvm?我的印象是使用“LinearDualCoordinateDescent”意味着在幕后使用了 Liblinear(据说速度更快) 另外 - 我已经非常严重 - 所以我认为非稀疏实现不会在我的场景中工作 @DaveBish 查看更新后的答案。它像以前的实现一样使用 LibSvm 名称中包含“Linear”的方法在底层使用 liblinear 的实现。名称中不包含“Linear”的方法要么使用 LibSVM 实现,要么在一些研究论文(即 SequentialMinimalOptimization)之后从头开始实现。 如果分配大量文档用于培训对您(或其他阅读此评论的人)来说是个问题,请在项目的问题跟踪器中打开一个新问题,其中包含您尝试的数据集样本学习。如果这有助于解决这个问题,那么将项目扩展为直接从磁盘读取样本应该不会太难。以上是关于Accord.Net - LibLinear 上的 CacheSize的主要内容,如果未能解决你的问题,请参考以下文章