具有概率或置信度的 Keras CNN 的 SVC 分类器以区分未经训练的类

Posted

技术标签:

【中文标题】具有概率或置信度的 Keras CNN 的 SVC 分类器以区分未经训练的类【英文标题】:SVC Classifier to Keras CNN with probabilities or confidence to distinguish untrained classes 【发布时间】:2021-08-06 03:19:19 【问题描述】:

这个问题与one 非常相似,并且基于 GitHub 上的this 帖子,从某种意义上说,我正在尝试将 SVM 多类分类模型(例如,使用 sklearn)转换为 Keras 模型。

具体来说,我正在寻找一种在最后检索概率(类似于 SVC probability=True)或置信度值的方法,以便我可以定义某种阈值并能够区分受过训练的类和未受过训练的类.也就是说,如果我用 3 或 4 个类训练我的模型,然后使用未训练的第 5 个,即使完全错误,它仍然会输出一些预测。我想以某种方式避免这种情况。

我得到以下工作相当不错,但它依赖于选择最后的最大值 (argmax),我想避免这种情况:

  model = Sequential()
  model.add(Dense(30, input_shape=(30,), activation='relu', kernel_initializer='he_uniform'))
  # output classes
  model.add(Dense(3, kernel_regularizer=regularizers.l2(0.1)))
  # the activation is linear by default, which works; softmax makes the accuracy be stuck 33% if targeting 3 classes, or 25% if targeting 4.
  #model.add(Activation('softmax')) 
  model.compile(loss='categorical_hinge', optimizer=keras.optimizers.Adam(lr=1e-3), metrics=['accuracy'])

关于如何解决这个未经训练的班级问题的任何想法?如果我仍然可以将模型保存为 onnx,则像 Plat scaling 或 Temperature scaling 这样的东西会起作用。

【问题讨论】:

【参考方案1】:

正如我所怀疑的,softmax 通过缩放模型的特征(输入)来工作。不需要停止渐变或任何东西。我专门使用了非常大的数字,尽管训练得很好,但仍阻止 softmax(逻辑回归)正常工作。例如,可以通过以下代码对特征进行缩放:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

通过这样做,使用 keras 的类 SVM 模型的输出将按照最初的预期输出概率。

【讨论】:

以上是关于具有概率或置信度的 Keras CNN 的 SVC 分类器以区分未经训练的类的主要内容,如果未能解决你的问题,请参考以下文章

如何获得keras预测模型CNN中的概率百分比

用keras作CNN卷积网络书本分类(书本非书本)

卷积层(CNN)如何在 keras 中工作?

Keras 中具有批量标准化的双向 LSTM

Keras CIFAR-10分类 自定义simple CNN篇

在基于 LIBSVM 的 scikit.smv.SVC 中启用概率估计