ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Chaquopy中不能导入64位Python训练的机器学习模型(32bit与64bit不兼容)

2021-02-27 22:58:15  阅读:326  来源: 互联网

标签:load java Python pickle 32bit AdaBoostActivity 64 android com


  我在Chaquopy中利用joblib来load一个在pycharm中写好的AdaBoost模型:

from joblib import dump, load
filename = join(dirname(__file__), 'gao1_to_gao2_1.pkl')
clf = load(filename)

  报错如下:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.NCEPU, PID: 18024
    com.chaquo.python.PyException: ValueError: Buffer dtype mismatch, expected 'SIZE_t' but got 'long long'
        at <python>.sklearn.tree._tree.Tree.__cinit__(_tree.pyx:607)
        at <python>.pickle.load_reduce(pickle.py:1587)
        at <python>.pickle.load(pickle.py:1210)
        at <python>.joblib.numpy_pickle._unpickle(numpy_pickle.py:504)
        at <python>.joblib.numpy_pickle.load(numpy_pickle.py:585)
        at <python>.AdaBoost.test(AdaBoost.py:76)
        at <python>.chaquopy_java.call(chaquopy_java.pyx:380)
        at <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:352)
        at com.chaquo.python.PyObject.callAttrThrowsNative(Native Method)
        at com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232)
        at com.chaquo.python.PyObject.callAttr(PyObject.java:221)
        at com.example.NCEPU.Student.Predict.AdaBoostActivity.callPythonCode(AdaBoostActivity.java:45)
        at com.example.NCEPU.Student.Predict.AdaBoostActivity.createList(AdaBoostActivity.java:61)
        at com.example.NCEPU.Student.Predict.AdaBoostActivity.lambda$initViews$1$AdaBoostActivity(AdaBoostActivity.java:56)
        at com.example.NCEPU.Student.Predict.-$$Lambda$AdaBoostActivity$dJAvP4dDDrPleKcJgBCESW0ea0M.onClick(Unknown Source:2)
        at android.view.View.performClick(View.java:7192)
        at android.view.View.performClickInternal(View.java:7166)
        at android.view.View.access$3500(View.java:824)
        at android.view.View$PerformClick.run(View.java:27592)
        at android.os.Handler.handleCallback(Handler.java:888)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:8169)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)

  翻遍stackoverflow发现是因为32位Python不能导入64位训练的模型,于是在Chaquopy中输出一下:

import platform
print(platform.architecture())

输出为:

('32bit', 'WindowsPE')

  果然,Chaquopy中Python默认是32位。那没办法,只能用32位Python训练模型然后再导入了。

1.安装32位python

  在官网下载32位的python38,然后安装,这个不再叙述。
  安装后在Pycharm上配置:
在这里插入图片描述
  这个时候在pycharm上打印:

import platform
print(platform.architecture())

  输出为:

('32bit', 'WindowsPE')

  可以看到当前版本已经是32位了

2.安装skleanr和pandas

  直接在pycharm的Terminal中安装:

pip install sklearn -i https://pypi.douban.com/simple
pip install pandas -i https://pypi.douban.com/simple

  安装过程有极大概率会报错,这中间省略了很多细节。。。。因为问题实在太多了,忘记记录了。不过最后是升级了一下pip就OK了。

3.训练模型并保存

这一步是在pycharm中进行的:

clf = AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_depth=7, min_samples_leaf=5),
                             n_estimators=200,
                             algorithm='SAMME', learning_rate=0.5)
clf = clf.fit(train_x, train_y)  # 训练模型
dump(clf, 'gao1_to_gao2_1.pkl')

4.Chaquopy中加载模型

  gao1_to_gao2_1.pkl放在python文件夹下:
在这里插入图片描述

from joblib import dump, load
filename = join(dirname(__file__), 'gao1_to_gao2_1.pkl')
clf = load(filename)

标签:load,java,Python,pickle,32bit,AdaBoostActivity,64,android,com
来源: https://blog.csdn.net/Cyril_KI/article/details/114191308

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有