【问题标题】:How to unpickle a class that is linked with C,C++ and python in Java/Android?如何在 Java/Android 中取消与 C、C++ 和 python 链接的类?
【发布时间】:2021-03-24 21:48:43
【问题描述】:

我使用链接https://pypi.org/project/EVM/ 使用称为EVM(极值机)的机器学习和基于统计的分类器。我在 python 中训练模型并使用以下代码将其保存为 pickle 文件。

import EVM
import pickle
mevm = EVM.MultipleEVM(tailsize=300, cover_threshold = 0.7, distance_multiplier = 0.7, distance_function = scipy.spatial.distance.euclidean)
mevm.train([trainX[i] for i in list(trainX.keys())])

#Save the trained model
with open('model.pkl','wb') as f:
  pickle.dump(mevm,f)

我可以使用相同的 Pickle 模块在 Python 中轻松加载相同的模型。当我保存时,所有权重都保存在 pickle 文件中,我可以进行如下推断,

import pickle
import EVM
with open('model.pkl','rb') as b:
     mevm = pickle.load(b)
print("Probability of given input", mevm.max_probabilities([embeds[i]]))

但我无法在 Android/Java 中读取相同的 pickle 文件(我想在我的 android 应用程序中使用这个保存的模型)。当我检查 EVM 类时,有一个 C 文件和一个使用“.pyx”文件连接的 C++ 文件。所有这 3 个文件都是使用 python EVM(即导入 EVM)类读取的。有关文件,请参阅以下链接 https://pypi.org/project/EVM/#files

我的问题是

  1. 如何在 Android/Java 中读取这个保存的模型?
  2. 既然是与C、C++和python链接的,那能用Java读吗?
  3. 还有其他更好的方法来保存它,以便我可以使用它 Andriod/Java 吗?

感谢任何潜在客户。

在此先感谢 :)

【问题讨论】:

    标签: java python machine-learning serialization pickle


    【解决方案1】:

    根据python文档here

    pickle 模块实现了用于序列化和反序列化 Python 对象结构的二进制协议。 “Pickling”是将 Python 对象层次结构转换为字节流的过程,而“unpickling”是逆操作,将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。酸洗(和解酸)也称为“序列化”、“编组”、1 或“扁平化”;但是,为避免混淆,这里使用的术语是“酸洗”和“解酸”

    这意味着给定的字节流仅在 Python 中仅在语法上有效,除非您想编写对象转译器。

    您以错误的方式解决问题。 ML 模型只是您优化的一组系数/参数,以获得目标变量的近似值。您应该能够采用该组系数/参数并在任何语言中使用它。

    【讨论】:

      猜你喜欢
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多