#python #machine-learning #scikit-learn #onnx #onnxruntime
#python #машинное обучение #scikit-learn #onnx #onnxruntime
Вопрос:
Я пытаюсь преобразовать / сохранить модель sklearn SVC в виде файла .onnx, и я получаю ошибку времени выполнения, которую я не понимаю. Я смог эффективно использовать этот же код без ошибок с классификатором случайного леса sklearn и классификатором sklearn k-NN. Я получаю странную ошибку времени выполнения onnx, которую я не понимаю. Приветствуется любая помощь с этой ошибкой.
Ниже я впервые опубликовал результат запуска моего файла svm_time.py и затем ниже приведен код, который включен в svm_time.py файл.
Спасибо.
python3 svm_time.py
'train_model' 4809.58 ms
train score is: 0.8765468473777254
val Accuracy is: 0.7037037037037037
Traceback (most recent call last):
File "svm_time.py", line 97, in <module>
main()
File "svm_time.py", line 91, in main
onx = convert_sklearn(clf, initial_types=initial_type)
File "/home/matt/anaconda3/envs/venv/lib/python3.7/site-packages/skl2onnx/convert.py", line 154, in convert_sklearn
dtype=dtype, options=options)
File "/home/matt/anaconda3/envs/venv/lib/python3.7/site-packages/skl2onnx/common/_topology.py", line 1054, in convert_topology
conv(scope, operator, container)
File "/home/matt/anaconda3/envs/venv/lib/python3.7/site-packages/skl2onnx/common/_registration.py", line 29, in __call__
return self._fct(*args)
File "/home/matt/anaconda3/envs/venv/lib/python3.7/site-packages/skl2onnx/operator_converters/support_vector_machines.py", line 221, in convert_sklearn_svm_classifier
"Classes different from first n integers are not supported "
RuntimeError: Classes different from first n integers are not supported in SVC converter.
from sklearn.preprocessing import StandardScaler
import pandas as pd
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import numpy as np
from sklearn.model_selection import train_test_split
import time
import math
import numpy as np
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
#https://medium.com/pythonhive/python-decorator-to-measure-the-execution-time-of-methods-fa04cb6bb36d
def timeit(method):
def timed(*args, **kw):
ts = time.time()
result = method(*args, **kw)
te = time.time()
if 'log_time' in kw:
name = kw.get('log_name', method.__name__.upper())
kw['log_time'][name] = int((te - ts) * 1000)
else:
print('%r %2.2f ms' %
(method.__name__, (te - ts) * 1000))
return result
return timed
clf = SVC(kernel='rbf', gamma=0.001, C=10)
@timeit
def train_model(in_data,in_labels):
clf.fit(in_data,in_labels)
def main():
data = pd.read_csv('fall_data.csv', header=None)
labels = pd.read_csv('fall_labels.csv', header=None)
data = data.to_numpy()
data_labels = labels[0]
train_set, test_set, train_label, test_label = train_test_split(
data, data_labels, test_size=0.1, random_state=42)
train_set2, val_set, train_label2, val_label = train_test_split(
train_set, train_label, test_size=0.1, random_state=42)
scaler = StandardScaler().fit(train_set2)
X_train = scaler.transform(train_set2)
X_val = scaler.transform(val_set)
train_model(X_train,train_label2)
tpred = clf.predict(X_train)
ts = accuracy_score(train_label2, tpred)
print('train score is: ', ts)
pred = clf.predict(X_val)
s = accuracy_score(val_label, pred)
print('val Accuracy is: ', s)
initial_type = [('float_input', FloatTensorType([None, 453]))]
onx = convert_sklearn(clf, initial_types=initial_type)
with open("svmrbf_unimib_f8.onnx", "wb") as f:
f.write(onx.SerializeToString())
if __name__ == '__main__':
main()
Ответ №1:
Мне кажется, что это может быть проблемой совместимости с Onnx и sklearn.
1). https://github.com/onnx/sklearn-onnx/issues/302
2). https://github.com/onnx/sklearn-onnx/blob/master/skl2onnx/operator_converters/support_vector_machines.py#L17
Основываясь на этих двух источниках, я изменил свой код, чтобы включить форму функции принятия решений OVO вместо OVR, и теперь, по крайней мере, когда я запускаю свой svm_time.py файл файл .onnx сохранен.
clf = SVC(kernel='rbf', gamma=0.001, C=10, decision_function_shape='ovo')