我正在尝试将一些旧代码从使用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分类器的替代方法吗?
谢谢。
答案 0 :(得分:2)
如果要进行分类,则需要squared_hinge
和regularizer
,以获得完整的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), W_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), W_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
答案 1 :(得分:0)
如果您使用的是Keras 2.0,则需要更改以下行的答案。
W_regularizer-> kernel_regularizer
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'])