keras - 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 损失函数。谢谢!
解决方案
可能有点晚了,但这是我的答案。
您可以通过多种方式做到这一点:
由于您有 2 个类,因此这是一个二元问题,您可以使用普通铰链。然后架构将只需要输出 1 个输出 -1 和一个如您所说的。
您也可以使用最后一层的输出 2,您只需输入标签的单热编码,然后使用分类铰链。
根据激活,一个线性层和一个 tanh 都将构成一个 SVM,tanh 将被平滑。
我建议将其设为二进制并使用 tanh 层,但同时尝试这两种方法以查看什么有效。
推荐阅读
- java - 从 XML 中提取属性值
- java - gradle:没有源任务':processTestResources'和':processtResources'
- swiftui-navigationlink - 后退按钮跳过 View1 -> View2 -> View3 NavigationLink 中的视图
- json - 如何使用 NLP 从条件语句中提取规则?
- swift - 无法在 swift 中为 tableview 单元格图像添加 Tapgesture
- google-maps - Google Maps JS API - 根据缩放级别调整所有自定义标记的大小
- vue.js - Vue 强制组件在可见之前渲染到 DOM
- python - 有没有办法将多对多对象关系变成字典?
- react-native - 屏幕更改时标签栏图标未完全居中
- c# - c#获取文本框中输入的值并根据选中的 2 个单选按钮执行计算并在标签中显示结果