2016-02-17 10 views
6

私はマシンにwekaモデルを作成し、それをアンドロイドプロジェクトにインポートしました。クラシファイアを作成しようとすると、作成したモデルを逆シリアル化しようとすると「exception.java.io.StreamCorruptedException」というエラーが発生します。コードは完全に機械で動作します。WekaモデルandroidのRead Error

これは、この問題を克服するために私を助けてください、これは完全なスタックトレースで、

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

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

私のコードです。

+0

この問題は販売されました。 – d7k

答えて

0

これは解決され、モデルは別の環境(PC)で作成され、2つのタイプのJDKが全く同じではないため、エラーを与えたアンドロイド環境で逆シリアル化しようとしました。

0

weka.jarの両方が同じバージョンであることを確認してください。 Androidランタイムにはwekaが使用するGUI関連パッケージが含まれていないため、GUIバージョンのWekaを使用してモデルを保存しないでください。

モデルをデスクトップでプログラムでビルドして保存し、Android経由でデシリアライズしても問題ありません。