2016-02-17 5 views
6

Ich habe mein Weka-Modell in der Maschine erstellt und es in das Android-Projekt importiert. Wenn ich versuche, den Klassifizierer zu erstellen, gibt es einen Fehler "exception.java.io.StreamCorruptedException", wenn ich versuche, das von mir erstellte Modell zu deserialisieren. Der Code funktioniert perfekt in der Maschine.Weka Modell Fehler in Android

Das ist mein Code

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); 

Dies ist die vollständige Stacktrace ist,

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$2.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)" 

Bitte helfen Sie mir, dieses Problem zu überwinden.

+0

das Problem wurde verkauft. – d7k

Antwort

0

Dies ist gelöst, das Modell wurde in einer anderen Umgebung (PC) erstellt und versucht, in der Android-Umgebung zu deserialisieren, die Fehler gab, weil die beiden Arten von JDK nicht gleich war.

0

Stellen Sie sicher, dass beide weka.jar dieselbe Version haben. Und verwenden Sie nicht die GUI-Version von Weka, um das Modell zu speichern, da die Android-Laufzeitumgebung keine GUI-bezogenen Pakete enthält, die von weka verwendet werden.

Es wäre in Ordnung, das Modell programmgesteuert mit Desktop zu erstellen und zu speichern und es über Android zu deserialisieren.