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&lt;double&gt; 数据结构,但它没有使用 LibLinear。如果您打开 Accord.NET 存储库并查看支持 LibLinear 的 SVM 求解算法(LinearCoordinateDescent、LinearNewtonMethod),您将看不到 CacheSize 属性。

【讨论】:

感谢您的回答 - 一个问题 - 这在幕后使用“Liblinear”吗?还是 Libsvm?我的印象是使用“LinearDualCoordinateDescent”意味着在幕后使用了 Liblinear(据说速度更快) 另外 - 我已经非常严重 - 所以我认为非稀疏实现不会在我的场景中工作 @DaveBish 查看更新后的答案。它像以前的实现一样使用 LibSvm 名称中包含“Linear”的方法在底层使用 liblinear 的实现。名称中不包含“Linear”的方法要么使用 LibSVM 实现,要么在一些研究论文(即 SequentialMinimalOptimization)之后从头开始实现。 如果分配大量文档用于培训对您(或其他阅读此评论的人)来说是个问题,请在项目的问题跟踪器中打开一个新问题,其中包含您尝试的数据集样本学习。如果这有助于解决这个问题,那么将项目扩展为直接从磁盘读取样本应该不会太难。

以上是关于Accord.Net - LibLinear 上的 CacheSize的主要内容,如果未能解决你的问题,请参考以下文章

使用 ID3 算法进行预测,Accord.Net 框架

无法使用 Accord.Net 框架实现基本决策树

使用 C# Accord .Net 从网络摄像头录制视频

使用accord.net 将数据分类为已知模式

Accord.NET多类SVM分类Kernel如何解决Out of memory异常

如何使用朴素贝叶斯和主成分分析(C#、Accord.NET)对文档进行分类