【问题标题】:Error in using WEKA SVM Model in my java code (Empty SVM model after saving it in WEKA)在我的 java 代码中使用 WEKA SVM 模型时出错(在 WEKA 中保存后的 SVM 模型为空)
【发布时间】:2017-03-06 10:44:57
【问题描述】:

我已经在 WEKA (3.7.3) 中训练了 LIBSVM 模型,现在想在我的 java 代码中使用它。但是,我遇到了一个例外。

Exception:Attempt to invoke interface method 'double weka.classifiers.Classifier.classifyInstance(weka.core.Instance)' on a null object reference

所有其他模型在这个 java 代码中都可以正常工作。此外,WEKA jar 的版本与我用于训练模型的版本完全相同。我的应用程序中没有任何 LIBSVM jar,因为我使用的是经过训练的模型。我需要在我的应用中放置 LIBSVM jar 吗?

我在这里缺少什么?

     inputStream = getApplicationContext().getAssets().open("svm.model");
     classifier = (Classifier) weka.core.SerializationHelper.read(inputStream);

这是模型的内容:

=== Model information ===

Filename:     svm.model
Scheme:       weka.classifiers.functions.LibSVM -S 0 -K 2 -D 3 -G 0.0 -R 0.0 -N 0.5 -M 40.0 -C 1.0 -E 0.001 -P 0.1 -model "D:\\Program Files (x86)\\Weka-3-7" -seed 1
Relation:     Sho_gsw30SVRNULL-weka.filters.unsupervised.attribute.Remove-R5-13,18-26,31-39,44-130
Attributes:   17
              F1
              F2
              F3
              F4
              F14
              F15
              F16
              F17
              F27
              F28
              F29
              F30
              F40
              F41
              F42
              F43
              class

=== Classifier model ===

LibSVM wrapper, original code by Yasser EL-Manzalawy (= WLSVM)

更新: 我尝试了 WEKA SMO(支持向量机分类器),它在我的代码中运行良好,但不是 LIBSVM 代码。

【问题讨论】:

  • 向我们显示您调用classifyInstance的代码
  • @Sentry 代码添加到原始问题中。
  • 似乎classifiernull,所以使用 SerializationHelper 加载它会出错。很难从远处说是什么原因。您能否检查文件“svm.model”是否存在以及它是否包含有效模型?
  • @Sentry 你可能是对的。模型文件存在,但是当我尝试在 WEKA 中重新加载它时,只有特征,没有别的。似乎 WEKA 没有正确保存模型?我只是在这里更新了模型的内容。我认为这是 WEKA 方面的问题,而不是 java 或 android。
  • 我试图回答

标签: java android svm weka libsvm


【解决方案1】:

如果您显示的模型内容是“svm.model”文件的实际内容,那么这就是罪魁祸首。

WEKA 中的模型文件是序列化的 Java 对象。它们可以通过训练一个相当于模型的分类器和serializing that Java WEKA classifier object into a file 来创建。该文件可能不是人类可读的。

这是基于我链接的 WEKA 网站序列化模型的代码:

// classifier will be your SVM classifier here
// and instances the training instances
classifier.buildClassifier(instances); 

// serialize model
ObjectOutputStream oos = new ObjectOutputStream(
                         new FileOutputStream("svm.model"));
oos.writeObject(classifier);
oos.flush();
oos.close();

然后您在问题中发布的代码可以加载和使用该模型。

【讨论】:

  • 我知道它可能不适合人类阅读。但是,保存的 SVM 模型中根本没有任何信息。我使用了 WEKA 的 SMO 分类器,它也实现了支持向量机,但有关于模型的信息。当我加载经过训练的 SMO 分类器时,其中包含有关模型的信息,但是 LIBSVM 分类器为空。在 WEKA 中保存模型意味着它的序列化。我对其他分类器使用了相同的方法,它们在我的代码中运行良好。所以问题似乎在于在 weka 中保存 libsvm 模型。
  • 您使用的是哪个 Weka 版本,您从哪里获得 Weka 的 LibSVM 分类器?这些也可能是添加到原始问题的好信息。
  • 我已经添加了weka版本。 WEKA 中只有一个用于 weka 的 libsvm 版本。
  • 我主要使用 Weka 3.6,为此我不得不单独下载 LibSVM。我会检查一下,看看能不能找到有用的东西。
  • 谢谢。是的,3.6 曾经是这种情况,但我猜自 3.7 以来不再如此。
【解决方案2】:

更新:我尝试了 WEKA SMO(支持向量机分类器),它在我的代码中运行良好,但在 LIBSVM 中却不行。

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 2016-05-31
    • 2013-08-26
    • 2017-10-01
    • 2016-10-29
    • 2018-06-05
    • 2014-08-01
    • 2016-06-02
    • 2019-09-15
    相关资源
    最近更新 更多