【问题标题】:how to load libsvm model in java after serialVersionUID has changedserialVersionUID 更改后如何在 java 中加载 libsvm 模型
【发布时间】:2014-04-25 21:00:40
【问题描述】:

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

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

我收到这个错误

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

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

【问题讨论】:

  • 请问你是怎么解决的?

标签: java serialization weka libsvm serialversionuid


【解决方案1】:

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

static final long serialVersionUID = -8642637231196646922;

到类的代码。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2015-07-06
      • 2013-07-10
      • 2013-01-19
      • 2012-06-02
      • 2013-09-07
      • 2012-12-21
      • 2016-01-24
      • 2013-01-11
      相关资源
      最近更新 更多