我有一个分层的神经网络,可以做一些事情,最后我需要一个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损失函数的信息。谢谢!
答案 0 :(得分:1)
可能会晚一点,但这是我的答案。
您可以通过多种方式进行操作:
由于您有2个类,因此它是一个二进制问题,您可以使用常规铰链。 这样,体系结构将只需要输出1个输出-1和一个如您所说的输出。
您也可以使用最后一层的输出2,您只需要对标签进行一次编码即可输入,然后使用分类铰链。
根据激活,线性层和tanh都会使SVM的tanh变得平滑。
我建议将其设置为二进制并使用tanh层,但请同时尝试两种方法,以查看有效的方法。