首页 > 解决方案 > Keras:使用铰链或分类铰链实现 SVM?

问题描述

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

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

方法 1 https://github.com/keras-team/keras/issues/2588(使用铰链)或如何在 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 层的激活应该是只有 1 个节点的 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 损失函数。谢谢!

标签: kerassvm

解决方案


可能有点晚了,但这是我的答案。

您可以通过多种方式做到这一点:

由于您有 2 个类,因此这是一个二元问题,您可以使用普通铰链。然后架构将只需要输出 1 个输出 -1 和一个如您所说的。

您也可以使用最后一层的输出 2,您只需输入标签的单热编码,然后使用分类铰链。

根据激活,一个线性层和一个 tanh 都将构成一个 SVM,tanh 将被平滑。

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


推荐阅读