CNN中使用SVM进行分类(keras的实现)

来源:互联网 发布:商城二次开发 php 编辑:程序博客网 时间:2024/05/15 05:07

相关理论可以看这篇文章 Deep Learning using Linear Support Vector Machines,ICML 2013

主要使用的是SVM的hinge loss形式的损失函数

原始的SVM的损失:(公式图片截取自开头的论文)


SVM的hinge loss形式的损失:(公式图片截取自开头的论文)


这里解决的是二分类问题,多分类的话和softmax一样,简单说明如下:(公式图片截取自开头的论文)


观察那个损失函数可以知道,它其实可以看做是一个 hinge loss 加上一个L2 regularization,前面的1/2就是L2正则项的系数lambda,这在CNN中很容易实现

使用CNN进行多分类的时候,最后一层的神经元个数是类别数目
使用softmax分类时,最后一层的激活函数设置为softmax就好

现在不用激活函数,或者激活函数设置为'linear',即即f(x)=x

prediction = Dense(7,activation='linear', #或者不适用激活函数?                           kernel_regularizer=regularizers.l2(0.5),                           name=name+'FC_linear')(x) 

然后在keras后端添加一个自定义损失(在源代码的losses.py中)

def categorical_squared_hinge(y_true, y_pred):    """    hinge with 0.5*W^2 ,SVM    """    y_true = 2. * y_true - 1 # trans [0,1] to [-1,1],注意这个,svm类别标签是-1和1    vvvv = K.maximum(1. - y_true * y_pred, 0.) # hinge loss,参考keras自带的hinge loss#    vvv = K.square(vvvv) # 文章《Deep Learning using Linear Support Vector Machines》有进行平方    vv = K.sum(vvvv, 1, keepdims=False)  #axis=len(y_true.get_shape()) - 1    v = K.mean(vv, axis=-1)    return v
最后,在编译模型的时候使用自定义损失,名字就是函数的名字了
model.compile( optimizer=adm, loss=['categorical_squared_hinge'], metrics=['accuracy'] )












0 0
原创粉丝点击