4

我已经在 weka 上训练了 libsvm 模型,然后我保存了模型。现在我想在java中使用这个模型。

Classifier cls = (Classifier)weka.core.SerializationHelper.read(this.modelPath);

我收到这个错误

“java.io.InvalidClassException:libsvm.svm_model;本地类不兼容:流 classdesc serialVersionUID = -8642637231196646922,本地类 serialVersionUID = 2709444323471798245”

当我运行上面的代码时。我想知道如何加载和使用模型。

4

2 回答 2

2

不必弄乱serialVersionUID。使用 SerializationHelper 保存/加载 LibSVM 模型文件(如this other answer中所述):

weka.core.SerializationHelper.write("/some/where/svm.model", svmModel);

LibSVM svm = (LibSVM) weka.core.SerializationHelper.read("/some/where/svm.model");
于 2015-02-18T12:05:01.467 回答
2

您有可能在保存模型和尝试加载模型之间更改了类定义(请参阅什么是 serialVersionUID 以及我为什么要使用它?以获得很好的解释)。可以将serialVersionUID其视为一种校验和,以确保您不会加载过时版本的类。除非那是您想要的,因为您比 Java 更了解您仍然可以使用旧模型 - 在这种情况下,您可以手动设置该 ID。为了告诉 Java 你当前的分类器仍然是最新的,添加

static final long serialVersionUID = -8642637231196646922;

到类的代码。

但是现在我想知道:Classifier看起来像 Weka 内置类。我不确定在这种情况下更改 serialVersionUID 有多容易。您是否可能更新了 Weka 版本?如果您真的对模型文件感兴趣,您可能想进入 Weka 的源代码并在serialVersionUID那里进行更改。

于 2014-05-12T23:16:31.693 回答