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

相关理论可以看这篇文章 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'] )












猜你喜欢

转载自blog.csdn.net/ying86615791/article/details/71366184