前提・実現したいこと
前回、pythonで学習したデータをpickleファイルをC++で開きたいスレを立てて皆様の力をお借りして実現したかったのですができたのは、
C++からPythonファイルを参照しそこから関数をもってその中にファイルを開くプログラムを書いて開くというのが限界でした。
なので一度改めてスレを立てて、もう一度挑戦したいと思います。
では、本題へ
実現したいことは
Pythonで書いたコードをC++に埋め込みたいので、cythonを使ってpythonコードからcのコードを生み出したいです。
C++に埋め込みたいPythonコード
変更点:scikit-learnには専用?の保存moduleがあったためこちらに変更
python
1from sklearn.externals import joblib 2def func(x,y): 3 model = joblib.load('model.joblib') 4 X_test = [[x,y]] 5 b = model.predict(X_test) 6 return b
一応前回のpickle-ver-
python
1import pickle 2#保存しているpklファイルを読み込む 3with open("model.pkl", "rb") as f: 4 model = pickle.load(f) 5#ここで予測したい値を入れる 6X_test = [[0.0401541,0.155155]] 7#予測結果を出す 8print(model.predict(X_test))
cytest.pyx
joblib-ver-
pyx
1from sklearn.externals import joblib 2from libc.stdio cimport printf 3cdef public struct Point: 4 double x 5 double y 6 7cdef public Point func(Point a,Point b): 8 cdef Point b 9 model = joblib.load('model.joblib') 10 X_test = [[a.x,b.y]] 11 b = model.predict(X_test) 12 printf("b=%f\n",b) 13 return b
pickle-ver
pyx
1from libc.stdio cimport printf 2import pickle 3cdef public struct Point: 4 double x 5 double y 6 7cdef public Point func(Point x1,Point y1): 8 cdef Point b 9 f = open("model.pkl", "rb") 10 model = pickle.load(f) 11 X_test = [[x1.x,y1.y]] 12 b = model.predict(X_test) 13 return b
###setup.py
python
1from distutils.core import setup 2from Cython.Build import cythonize 3 4setup(ext_modules=cythonize("cytest.pyx"))
###動かしたいC++プログラム
c++
1#include <iostream> 2#include<Python.h> 3#include<stdio.h> 4#include "cytest.h" 5 6int main() { 7 Py_Initialize(); 8 struct Point a; 9 struct Point b; 10 a.x = 0.2346; 11 b.y = 0.0324; 12 struct Point b = func(a, b); 13 printf("b=%f\n", b); 14 Py_Finalize(); 15}
###現在詰まっているところ
python setup.py build_ext --inplaceを実行すると、
となっておりpickleをimportすることによってできるpickle.loadでコンパイルできないよって言われている。(おそらく)
補足情報(FW/ツールのバージョンなど)
windows10
visual studio 2017
python3.6.8
model.joblib(107KB)
model.pkl(502KB)
回答1件
あなたの回答
tips
プレビュー