【问题标题】:Convert sklearn.svm SVC classifier to Keras implementation将 sklearn.svm SVC 分类器转换为 Keras 实现
【发布时间】:2019-06-22 04:30:07
【问题描述】:

我正在尝试将一些旧代码从使用 sklearn 转换为 Keras 实现。由于保持相同的操作方式至关重要,因此我想了解我是否正确执行。

我已经转换了大部分代码,但是我在转换 sklearn.svm SVC 分类器时遇到了问题。这是它现在的样子:

from sklearn.svm import SVC
model = SVC(kernel='linear', probability=True)
model.fit(X, Y_labels)

超级简单,对。但是,我在 Keras 中找不到 SVC 分类器的类比。所以,我试过的是这样的:

from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='softmax'))
model.compile(loss='squared_hinge',
              optimizer='adadelta',
              metrics=['accuracy'])
model.fit(X, Y_labels)

但是,我认为无论如何都是不正确的。请你帮我从 Keras 的 sklearn 中找到 SVC 分类器的替代品吗?

谢谢。

【问题讨论】:

  • 您所说的“另类”究竟是什么意思? Keras 专门是一个神经网络框架,它不包含 SVM 功能……
  • 是的,它不是开箱即用的,但您可以组成一个模型,作为 sklearn-kit 中的 SVM 损失函数的替代品。这种模型在下面的答案中提出。
  • 好吧,我不清楚“替代”的含义,但既然你得到了一个有意义的答案,一切都很好(当你看到大约 2 个问题/月抱怨,比如说,关于 的准确性低回归设置,假设OP确切地知道他/她在说什么开始感觉不那么可靠...... :)

标签: machine-learning keras scikit-learn neural-network svm


【解决方案1】:

如果您正在制作分类器,则需要squared_hingeregularizer,才能获得完整的SVM 损失函数,如here. 所示,因此您还需要在执行之前打破最后一层添加正则化参数激活,我这里加了代码。

这些更改应该为您提供输出

from keras.regularizers import l2
from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(64, activation='relu'))
model.add(Dense(1), kernel_regularizer=l2(0.01))
model.add(activation('softmax'))
model.compile(loss='squared_hinge',
              optimizer='adadelta',
              metrics=['accuracy'])
model.fit(X, Y_labels)

另外hinge 在 keras 中实现了二进制分类,所以如果你正在处理二进制分类模型,请使用下面的代码。

from keras.regularizers import l2
from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(64, activation='relu'))
model.add(Dense(1), kernel_regularizer=l2(0.01))
model.add(activation('linear'))
model.compile(loss='hinge',
              optimizer='adadelta',
              metrics=['accuracy'])
model.fit(X, Y_labels)

如果您无法理解文章或对代码有疑问,请随时发表评论。 前段时间我也遇到了同样的问题,这个 GitHub 帖子帮助我理解了,也许也经历过,这里的一些想法直接来自这里 https://github.com/keras-team/keras/issues/2588

【讨论】:

  • 非常感谢,特别是对于参考资料,他们提供了很多帮助,不仅获得了现成的解决方案,而且了解了幕后的情况。在我的例子中,它是一个多类分类器,所以我使用 squared_hinge 损失函数。据我了解,我的代码与您提供的代码之间的唯一区别是使用了正则化器,顺便说一句,这是我现在唯一无法理解的部分。我会自己挖掘更多,因为我根本不熟悉 L2 正则化器。
  • 你能解释一下为什么最后一个密集层只有1个节点吗?
  • 还要解释一下 W_regularizer,因为我在使用它时遇到了错误。
  • 当我在 mnist 数据集上尝试类似的代码时,它给出的结果非常差,比如 10-11% 的准确度。
  • @Chhaganlaal 没有这样的参数。您可以改用 kernel_regularizer 或 bias_
【解决方案2】:

如果您使用的是Keras 2.0,那么您需要更改anand v sing的答案的以下几行。

W_regularizer -> kernel_regularizer

Github link

model.add(Dense(nb_classes, kernel_regularizer=regularizers.l2(0.0001)))
model.add(Activation('linear'))
model.compile(loss='squared_hinge',
                      optimizer='adadelta', metrics=['accuracy'])

或者你可以使用关注

top_model = bottom_model.output
  top_model = Flatten()(top_model)
  top_model = Dropout(0.5)(top_model)
  top_model = Dense(64, activation='relu')(top_model)
  top_model = Dense(2, kernel_regularizer=l2(0.0001))(top_model)
  top_model = Activation('linear')(top_model)
  
  model = Model(bottom_model.input, top_model)
  model.compile(loss='squared_hinge',
                      optimizer='adadelta', metrics=['accuracy'])
  

【讨论】:

猜你喜欢
  • 2020-08-26
  • 2019-08-24
  • 2017-08-08
  • 1970-01-01
  • 2017-02-16
  • 2023-01-27
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
相关资源
最近更新 更多