Keras:使用铰链或分类铰链实现SVM?

时间:2018-08-07 16:51:42

标签: keras svm

我有一个分层的神经网络,可以做一些事情,最后我需要一个SVM。我已经在堆栈交换上进行了搜索和搜索,似乎它可以使用损失函数铰链或categorical_hinge在keras中轻松实现。但是,我对使用哪个感到困惑。

我的示例将被分类为二进制类,即0类或1类。因此,我可以通过以下方式进行操作:

方法1 https://github.com/keras-team/keras/issues/2588(使用铰链)或How do I use categorical_hinge in Keras?(使用categorical_hinge):

标签的形状将为(,2),其值为0或1,表明它是否属于该类。

nb_classes = 2
model.add(Dense(nb_classes), W_regularizer=l2(0.01))
model.add(Activation('linear'))

model.compile(loss='hinge OR categorical_hinge ??,
              optimizer='adadelta',
              metrics=['accuracy'])

那么类是两个输出节点中具有较高值的​​节点吗?

方法2 https://github.com/keras-team/keras/issues/2830(使用铰链):

第一个评论者提到铰链应该是binary_hinge,并且标签必须为-1或1(否或是),并且对最后一个SVM层的激活应为tanh(仅包含一个节点)。 因此它看起来应该像这样,但是标签将是(,1)形状,其值为-1或1。

model.add(Dense(1), W_regularizer=l2(0.01))
model.add(Activation('tanh'))

model.compile(loss='hinge',
              optimizer='adadelta',
              metrics=['accuracy'])

那么哪种方法正确或更合适?我不确定该使用什么,因为在线有多个答案,而keras文档中根本没有关于铰链和categorial_hinge损失函数的信息。谢谢!

1 个答案:

答案 0 :(得分:1)

可能会晚一点,但这是我的答案。

您可以通过多种方式进行操作:

由于您有2个类,因此它是一个二进制问题,您可以使用常规铰链。 这样,体系结构将只需要输出1个输出-1和一个如您所说的输出。

您也可以使用最后一层的输出2,您只需要对标签进行一次编码即可输入,然后使用分类铰链。

根据激活,线性层和tanh都会使SVM的tanh变得平滑。

我建议将其设置为二进制并使用tanh层,但请同时尝试两种方法,以查看有效的方法。