android 中的 Weka 模型读取错误

Weka model Read Error in android

我在机器上创建了我的 weka 模型并将其导入到 android 项目中。当我尝试创建分类器时,当我尝试反序列化我创建的模型时,它给出了一个错误 "exception.java.io.StreamCorruptedException"。该代码在机器上完美运行。

这是我的代码,

InputStream fis = null;

        fis = new InputStream("/modle.model");

        InputStream is = fis;

        Classifier cls = null;

       //here im getting the error when trying to read the Classifier
            cls = (Classifier) SerializationHelper.read(is);

        FileInputStream datais = null;

            datais = new FileInputStream("/storage/emulated/0/window.arff");


        InputStream dataIns = datais;
        DataSource source = new DataSource(dataIns);
        Instances data = null;
        try {
            data = source.getDataSet();
        } catch (Exception e) {
            e.printStackTrace();
        }
        data.setClassIndex(data.numAttributes() - 1);

        Instance in = new Instance(13);
        in.setDataset(data);
        in.setValue(0, testWekaModle1[0]);
        in.setValue(1, testWekaModle1[1]);
        in.setValue(2, testWekaModle1[2]);
        in.setValue(3, testWekaModle1[3]);
        in.setValue(4, testWekaModle1[4]);
        in.setValue(5, testWekaModle1[5]);
        in.setValue(6, testWekaModle1[6]);
        in.setValue(7, testWekaModle1[7]);
        in.setValue(8, testWekaModle1[8]);
        in.setValue(9, testWekaModle1[9]);
        in.setValue(10, testWekaModle1[10]);
        in.setValue(11, testWekaModle1[11]);

        double value = 0;

            value = cls.classifyInstance(in);

        in.setClassValue(value);

这是完整的堆栈跟踪,

java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2109)
java.io.ObjectInputStream.<init>(ObjectInputStream.java:372)
weka.core.SerializationHelper.read(SerializationHelper.java:288)
info.androidhive.sleepApp.model.ControllerWeka.wekaModle(ControllerWeka.java:81)
info.androidhive.sleepApp.activity.HomeFragment.extract(HomeFragment.java:278)
info.androidhive.sleepApp.activity.HomeFragment.stop(HomeFragment.java:146)
"info.androidhive.sleepApp.activity.HomeFragment.onClick(HomeFragment.java:107)"
android.view.View.performClick(View.java:4475)"
android.view.View$PerformClick.run(View.java:18786)"
android.os.Handler.handleCallback(Handler.java:730)"
dalvik.system.NativeStart.main(Native Method)"
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)"
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)"
java.lang.reflect.Method.invoke(Method.java:525)"
java.lang.reflect.Method.invokeNative(Native Method)"
android.app.ActivityThread.main(ActivityThread.java:5419)"
android.os.Looper.loop(Looper.java:137)"
android.os.Handler.dispatchMessage(Handler.java:92)"

请帮我解决这个问题。

这已解决,模型是在不同的环境 (PC) 中创建的,并尝试在 android 环境中反序列化,但由于两种类型的 JDK 不相同而出错完全没有。

确保两个 weka.jar 具有相同的版本。 并且不要使用 Weka 的 GUI 版本来保存模型,因为 Android 运行时不包含 weka 使用的 GUI 相关包。

最好使用桌面以编程方式构建和保存模型,然后通过 Android 对其进行反序列化。