尝试校准 keras 模型

NoS*_*per 2 python machine-learning scikit-learn keras tensorflow

我正在尝试通过 Sklearn 实现来校准我的 CNN 模型CalibratedClassifierCV,尝试将其包装为KerasClassifier并覆盖预测函数,但没有成功。有人可以说我做错了什么吗?这是模型代码:

def create_model():
    model = Sequential()
    model.add(Conv2D(64, kernel_size=(3,3), activation = 'relu', input_shape=(28, 28 ,1) ))
    model.add(MaxPooling2D(pool_size = (2, 2)))

    model.add(Conv2D(64, kernel_size = (3, 3), activation = 'relu'))
    model.add(MaxPooling2D(pool_size = (2, 2)))

    model.add(Conv2D(64, kernel_size = (3, 3), activation = 'relu'))
    model.add(MaxPooling2D(pool_size = (2, 2)))

    model.add(Flatten())
    model.add(Dense(128, activation = 'relu'))
    model.add(Dropout(0.20))

    model.add(Dense(24, activation = 'softmax'))

    model.compile(loss = keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adam(), metrics=['accuracy'])
    
    return model
Run Code Online (Sandbox Code Playgroud)

这是我试图校准它:

model = KerasClassifier(build_fn=create_model,epochs=5, batch_size=128,validation_data=(evalX_cnn, eval_y_cnn))
model.fit(trainX_cnn, train_y_cnn)
model_c = CalibratedClassifierCV(base_estimator=model, cv='prefit')
model_c.fit(valX_cnn, val_y_cnn)
Run Code Online (Sandbox Code Playgroud)

输出 :

-------------------------------------------------------
TypeError             Traceback (most recent call last)
<ipython-input-19-3d3ce9ce4fca> in <module>
----> 1 model_c.fit(np.array(valX_cnn), np.array(val_y_cnn))

~\anaconda3\lib\site-packages\sklearn\calibration.py in fit(self, X, y, sample_weight)
    286             pred_method, method_name = _get_prediction_method(base_estimator)
    287             n_classes = len(self.classes_)
--> 288             predictions = _compute_predictions(pred_method, method_name, X, n_classes)
    289 
    290             calibrated_classifier = _fit_calibrator(

~\anaconda3\lib\site-packages\sklearn\calibration.py in _compute_predictions(pred_method, method_name, X, n_classes)
    575         (X.shape[0], 1).
    576     """
--> 577     predictions = pred_method(X=X)
    578 
    579     if method_name == "decision_function":

TypeError: predict_proba() missing 1 required positional argument: 'x'
Run Code Online (Sandbox Code Playgroud)

valX_cnn 和 val_y_cnn 的类型为 np.array。

甚至尝试重写该方法:

keras.models.Model.predict_proba = keras.models.Model.predict
Run Code Online (Sandbox Code Playgroud)

Mar*_*ani 8

问题是因为predict_probafromKerasClassifier需要x作为输入,而predict_probasklearn 的方法接受X作为输入参数(注意区别:X不是x)。

您可以简单地将问题包装KerasClassifier到新类中以纠正该predict_proba方法。

samples,classes = 100,3

X = np.random.uniform(0,1, (samples,28,28,1))
Y = tf.keras.utils.to_categorical(np.random.randint(0,classes, (samples)))

class MyKerasClassifier(KerasClassifier):
  
  def predict_proba(self, X):
      return self.model.predict(X)

model = MyKerasClassifier(build_fn=create_model, epochs=3, batch_size=128)
model.fit(X, Y)

model_c = CalibratedClassifierCV(base_estimator=model, cv='prefit')
model_c.fit(X, Y)
Run Code Online (Sandbox Code Playgroud)