我习惯使用sklearn
,我觉得很容易理解其文档。但是,我现在需要学习使用OpenCV
-特别是,我需要能够使用MLP分类器,并在输入新的训练数据时更新其权重。
在sklearn中,可以使用partial_fit
方法来完成。根据OpenCV文档,可以设置一个UPDATE_WEIGHTS
标志,但是我不知道如何在代码中包含它。
这是我到目前为止所拥有的MCVE:
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
import numpy as np
import cv2
from sklearn.neural_network import MLPClassifier
def softmax(x):
softmaxes = np.zeros(x.shape)
for i in range(x.shape[1]):
softmaxes[:, i] = np.exp(x)[:, i]/np.sum(np.exp(x), axis=1)
return softmaxes
data = load_breast_cancer()
X = data.data
y = data.target.reshape(-1, 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1729)
y2 = np.zeros((y_train.shape[0], 2))
y2[:,0] = np.where(y_train==0, 1, 0)
y2[:,1] = np.where(y_train==1, 1, 0)
ann = cv2.ml.ANN_MLP_create()
ann.setLayerSizes(np.array([X.shape[1], y2.shape[1]]))
ann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM)
ann.train(np.float32(X_train), cv2.ml.ROW_SAMPLE, np.float32(y2))
mlp = MLPClassifier()
mlp.fit(X_train, y_train)
preds_proba = softmax(ann.predict(np.float32(X_test))[1])
print(roc_auc_score(y_test, preds_proba[:,1]))
print(roc_auc_score(y_test, mlp.predict_proba(X_test)[:,1]))
由于OpenCV分类器和sklearn学习者之间的得分具有可比性,我非常相信它的实施正确。
如何修改此代码,以便在引入新的训练样本时,我可以仅基于该样本来更新权重,而不是对整个训练集进行重新训练?
sklearn
中的等效项为:
mlp.partial_fit(X_new_sample, y_new_sample)
。
答案 0 :(得分:0)
找出答案。语法如下:
ann.train(cv2.ml.TrainData_create(np.float32(X), 0, np.float32(y)), flags=1)