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

13 篇文章 0 订阅
3 篇文章 0 订阅

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

更新:

有人说看不懂?
首先:
svm的预测输出是f(x) = w^T * x, f(x)>0表示一类, f(x)<0表示另一类, f(x)==0表示超平面, 这就是二分类了.
然后:
注意看损失函数, 原始损失s.t.里面是约束条件, 要求f(x)必须和标签t同号, 即f(x)*t>(1-ε)>0 (本来是f(x)*t>1, 1是间隔, 后来加入了松弛变量ε, 允许一些离群点, 为了增加分类器的容错性)!

再看hinge loss形式, 当f(x)与标签t不同号时, f(x)*t<0, 那么max(1-f(x)*t, 0)>1, 损失值肯定>1.
然而在优化hinge loss的时候(就是训练分类器的时候), 损失值逐渐下降, 分类器函数拟合这些点, 使得大部分点满足f(x)*t>0, 即预测输出f(x)与t同号!

所以分类器训练完毕后, 直接用f(x)>0表示一类, f(x)<0表示另一类. 这是针对二分类. 在CNN中实现时w就是最后一个全连接层的参数了

那么对于多分类呢, 常用的方法是one-versus-rest, 即一对多, 具体是啥可以网上查查
在开头那篇文章中, 做法是如果有K个类别, 就在CNN中训练K个二分类的svm分类器, 就是对应一个具有K个神经元输出的全连接层, 每个分类器表示1个类别, 最后预测输出值最大的那个神经元(svm分类器)对应的类别作为最终的预测类别!

 

  • 11
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
PythonCNNSVM都是常用的机器学习算法,可以用于特征提取。 CNN(卷积神经网络)是一种在图像分类和计算机视觉任务广泛应用的算法。它能够自动从原始图像数据提取重要的特征,并用于分类或预测。在Python,我们可以使用Keras或TensorFlow等库来构建和训练CNN模型。通过逐层堆叠卷积层、池化层和全连接层,CNN可以将原始图像数据转化为高阶特征表示。这些高阶特征通常包含了图像的边缘、纹理等信息,对于图像分类等任务非常有用。 SVM(支持向量机)是一种广义线性分类模型,可以用于特征提取和分类SVM通过将数据映射到高维特征空间,并在该空间构建一个最优超平面来进行分类。在Python,我们可以使用scikit-learn等库来构建和训练SVM模型。SVM可以根据训练数据的特征,找到一个决策边界,并将数据划分为两个不同的类别。它能够根据各个特征的重要性来进行分类,对于特征提取和分类问题有较好的效果。 组合使用CNNSVM可以实现更强大的特征提取。首先,使用CNN从原始图像数据提取出高阶特征。然后,使用SVM对这些高阶特征进行分类。这种方法能够更好地利用CNN的特征提取能力,并且在分类时能够更好地处理非线性问题。在Python,我们可以通过使用Keras或TensorFlow构建和训练CNN模型,然后使用scikit-learn库SVM模型对提取的特征进行分类。 总结来说,PythonCNNSVM都可以用于特征提取。通过使用CNN从原始数据提取高阶特征,再利用SVM对这些特征进行分类,可以提高分类的准确性和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值