C# Accord.Net-LibLinear上的缓存大小

C# Accord.Net-LibLinear上的缓存大小,c#,machine-learning,libsvm,accord.net,liblinear,C#,Machine Learning,Libsvm,Accord.net,Liblinear,我正在尝试对一些输入进行分类(文本分类:10000多个示例和100000多个特征) 我已经读到,对于这样的任务,使用LibLinear要快得多/内存效率更高,因此,我将我的LibSvm分类器移植到accord/net,如下所示: //SVM Settings var teacher = new MulticlassSupportVectorLearning<Linear, Sparse<double>>() {

我正在尝试对一些输入进行分类(文本分类:10000多个示例和100000多个特征)

我已经读到,对于这样的任务,使用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);
//SVM设置
var teacher=新的MulticlassSupportVectorLearning()
{
//对每个SVM使用LIBLINEAR的L2损耗SVC对偶
学习者=(p)=>新直线双坐标下降()
{
损失=Loss.L2,
复杂性=1,
}
};
var inputs=allTerms.Select(t=>newsparse(t.tension.Select(s=>s.Index).ToArray(),t.tension.Select(s=>(double)s.Value.ToArray()).ToArray();
var Class=allTerms.Select(t=>t.Class.ToArray();
//训练模型
var模型=教师学习(输入、课堂);
.Learn()
-我从MemoryException中得到了一个即时的

我已经看到文档中有一个
CacheSize
设置,但是,我找不到可以降低此设置的位置,如许多示例所示

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


非常感谢您的帮助

为10000多个具有100000多个功能的文档分配哈希空间至少需要4 GB内存,这可能受到和CLR对象大小限制的限制。默认情况下,许多项目更倾向于在32位平台下构建,该平台不允许分配超过2GB的对象。我通过删除32位平台首选项(转到project properties->build并取消选中“Preference 32-bit”)成功地克服了这一问题。之后,我们应该允许创建占用超过2GB或内存的对象,将这一行添加到配置文件中

<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设置
var teacher=新的MulticlassSupportVectorLearning()
{
学习者=(p)=>新的顺序最小优化()
{
缓存大小=1000
复杂性=1,
}
};
var inputs=allTerms.Select(t=>newsparse(t.tension.Select(s=>s.Index).ToArray(),t.tension.Select(s=>(double)s.Value.ToArray()).ToArray();
var Class=allTerms.Select(t=>t.Class.ToArray();
//训练模型
var模型=教师学习(输入、课堂);

这种构造支持向量机的方法确实可以处理
稀疏
数据结构,但它不使用LibLinear。如果打开存储库并查看支持LibLinear(,)的SVM求解算法,您将不会看到CacheSize属性

您能提供完整的示例(gist)吗?请在Accord.NET问题跟踪网站上发布一个问题,提供您试图学习的内容的完整示例,如果可能,包括数据集。感谢您的回答-一个问题-这在幕后使用“Liblinear”吗?还是Libsvm?我的印象是,使用“LinearDualCoordinationDescent”意味着Liblinear也在幕后使用(据说速度要快得多)——我已经做了很多工作——因此我认为非稀疏实现在我的系统中不起作用scenario@DaveBish请参阅更新的答案。它使用LibSvm,就像以前的实现方法(名称中包含“Linear”)使用liblinear的实现一样。名称中不包含“线性”的方法可以使用LibSVM实现,也可以在几篇研究论文(即SequentialMinimalOptimization)之后从无到有地实现。如果为培训分配大量文档是您(或阅读此评论的任何其他人)的问题请使用您试图学习的数据集样本在项目的问题跟踪程序中打开新问题。如果可以帮助解决这个问题,那么扩展项目直接从磁盘读取样本应该不会太困难。