一直想写这个方法,CNN+SVM是我一开始学习的时候想复现的,结果学了很久才达到目标。主要还是太急于求成了,而且现成的资料很难查到,等对CNN和SVM模型以及训练方法有了一定了解以后,我才真正复现。但是实际上这个方法效果一般,只是给大家提供一种思路而已。
大家都知道CNN是通过梯度下降法,不断正向加反向传播来实现参数优化的,而SVM则更像是一次性的方法,只能正向传播,并不能同样进行反向传播,极限学习ELM也是一样的。因此,二者不能同步,CNN+SVM是无法直接进行训练的,这是必须首先认识到的一点。
因此CNN+SVM的典型过程就是CNN训练、保存参数、载入参数并输出特征值、再次训练加测试这几个步骤。
这个过程比较常规,以普通1DCNN模型为例,我们首先进行训练,而后保存模型参数:
- def CNN_1D():
- inputs1 = Input(shape=(2048, 1))
- conv1 = Conv1D(filters=16, kernel_size=6, strides=2)(inputs1)
- BN1 = BatchNormalization()(conv1)
- act1 = Activation('relu')(BN1)
- pool1 = MaxPooling1D(pool_size=2, strides=2)(act1)
- conv4 = Conv1D(filters=24, kernel_size=3, padding='same')(pool1)
- BN2 = BatchN