首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibLinear上的Accord.Net - CacheSize

LibLinear上的Accord.Net - CacheSize
EN

Stack Overflow用户
提问于 2017-06-07 07:33:29
回答 1查看 257关注 0票数 4

我正在尝试对一些输入进行分类(文本分类: 10,000+示例和100,000+特征)

我读到使用LibLinear可以更快/更高效地完成这类任务,因此,我将我的LibSvm分类器移植到了accord/net,如下所示:

代码语言:javascript
复制
        //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)如果是这样的话-有什么方法可以避免这种情况吗?

如有任何帮助,我们不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2017-06-16 00:07:47

使用100000+功能分配10000+文档的散列空间将至少占用4 GB内存,这可能受到AppDomain memory limit和CLR对象大小限制的限制。默认情况下,很多项目都是在32位平台下构建的,不允许分配超过2 2GB的对象。我已经设法克服了这个问题,删除了32位平台首选项(转到项目属性-> build并取消选中“首选32位”)。之后,我们应该允许创建占用超过2 GB或内存的对象,将此行添加到您的配置文件中

代码语言:javascript
复制
<runtime>
    <gcAllowVeryLargeObjects enabled="true" />
</runtime>

请注意,如果添加此行但保留32位平台构建首选项,则仍将获得异常,因为您的项目将无法分配这种大小的数组

下面是调优CacheSize的方法

代码语言:javascript
复制
//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);

这种构造支持向量机的方法确实可以处理Sparse<double>数据结构,但它没有使用LibLinear。如果您打开Accord.NET存储库并查看具有LibLinear支持(LinearCoordinateDescentLinearNewtonMethod)的支持向量机求解算法,您将不会看到任何CacheSize属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44401270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档