Accord.net-在liblinear上缓存



我正在尝试对某些输入进行分类(文本分类:10,000多个示例和100,000多个功能(

我已经读到,使用liblinear对于此类任务的速度更快/更高的内存效率,因此,我已经将LibSVM分类器移植到了cond/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设置,但是,我找不到可以降低此设置的位置,如许多示例中所示。

一个可能的原因 - 我使用的是"哈希技巧"而不是索引 - 是Accord.net试图分配完整的哈希空间数组吗?(可能接近int.maxvalue(如果是 - 是否有任何方法可以避免这种情况?

任何帮助都非常感谢!

分配具有100000多个功能的10000多个文档的哈希空间将占用至少4 GB的内存,这可能会受到AppDomain内存限制和CLR对象大小限制的限制。默认情况下,许多项目都希望在32位平台下构建,该平台不允许对象分配超过2GB。我设法通过删除32位平台的优选(转到Project Properties -> build and Charbeck" Peave 32位"(来克服这一点。之后,我们应该允许创建更多的对象,以多2 GB或内存,将此行添加到您的配置文件

<runtime>
    <gcAllowVeryLargeObjects enabled="true" />
</runtime>

请注意,如果您添加此行,但请留下32位平台构建偏好,您仍然会得到例外,因为您的项目将无法分配此类大小

这就是您调整缓存的方式

//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支持(线性涂层的,LinearNewtonMethod(的SVM求解算法,则不会看到没有缓存的属性。

最新更新