4

我正在尝试对一些输入进行分类(文本分类: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文档中有一个设置,但是,我找不到可以降低此设置的位置,如许多示例中所示。

一个可能的原因——我使用的是“哈希技巧”而不是索引——Accord.Net 是否试图分配一个完整的哈希空间数组?(可能接近 int.MaxValue)如果是这样 - 有没有办法避免这种情况?

非常感谢任何帮助!

4

1 回答 1

1

为 10000+ 个文档和 100000+ 个特征分配哈希空间将至少占用 4 GB 内存,这可能受到AppDomain 内存限制和 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 求解算法(LinearCoordinateDescentLinearNewtonMethod),您将看不到 CacheSize 属性。

于 2017-06-15T16:07:47.097 回答