我在weka上训练了libsvm模型然后我保存了模型。现在我想在java中使用这个模型。
Classifier cls = (Classifier)weka.core.SerializationHelper.read(this.modelPath);
我收到此错误
“java.io.InvalidClassException:libsvm.svm_model; local class 不兼容:stream classdesc serialVersionUID = -8642637231196646922,本地类serialVersionUID = 2709444323471798245“
当我运行上面的代码。我想知道如何加载和使用模型。
答案 0 :(得分:2)
您可能在保存模型的时间和尝试加载模型的时间之间更改了类定义(例如,请参阅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
。
答案 1 :(得分:1)
不必乱用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");