CNN-SVM(卷积神经网络-支持向量机)是一种将卷积神经网络(CNN)与支持向量机(SVM)组合起来的深度学习模型。CNN-SVM模型的目标是通过结合CNN的特征提取能力和SVM的分类能力来提升图像分类、模式识别等任务的性能。以下详细介绍这两种模型各自的数学原理及其组合后的工作原理。
NO.1|CNN(卷积神经网络)的数学模型
CNN是一种适用于图像处理和其他结构化数据的深度神经网络。其核心组成部分包括卷积层、池化层和全连接层。
1.1 卷积层的数学表示
卷积层的主要作用是从输入数据中提取特征。假设输入是一幅图像I,卷积核K大小为m×n,则卷积操作可以表示为:
其中,S(i,j)是卷积操作后的输出特征图上的像素值。通过滑动卷积核在图像上进行卷积操作,生成新的特征图。多个卷积核可以捕捉图像的不同特征,如边缘、纹理等。
1.2 池化层的数学表示
池化层 (Pooling)通常用来减少特征图的大小,从而减小计算量并增加模型的鲁棒性。最常见的池化操作是最大池化(Max Pooling),其数学表示为:
这里,P(i,j)是池化后的输出,池化窗口选取了输入特征图$S(i,j)$上的一个小块区域,通过最大值或平均值等方式进行降维。
1.3 全连接层
全连接层将来自卷积和池化后的特征展平为向量,并通过权重矩阵W和偏置项b进行线性变换:
x是输入的展平特征向量,z是全连接层的输出。最后,这些输出通过激活函数(如ReLU或Softmax) 得到最终的分类结果。
NO.2|SVM(支持向量机)的数学模型
SVM是一种用于二分类问题的监督学习模型,其核心思想是通过找到一个最优的超平面来将不同类别的数据分开。对给定的训练数据 ,其中xi是输入向量, 表示类别标签。SVM试图找到一个超平面:
其中,w是权重向量,b是偏置项。为了找到最优的超平面,SVM的目标是最大化超平面到两类数据的最小距离,这转化为一个优化问题:
同时满足约束条件:
当数据不完全线性可分时,可以引入松弛变量$xi_{i}$ 来允许一些数据点被错误分类:
其中C是调节惩罚项的超参数。对于非线性可分问题,SWM诵过使用核函数将数据映的到高维空间,使其线性可分。常见的核函数有线性核、多项式核和RBF核。
NO.3|CNN-SVM组合模型
CNN-SVM模型结合了CNN的特征提取能力和SVW的强分类能力。其基本思路是使用CNN进行特征提取,然后将这些提取到的高维持征输入到SWM进行分类。与直接使用CNN的全连接层和Softmax分类器相比,SVM分类器能够更好地处理高维特征空间中的复杂分类问题。
3.1 CNN-SVM模型的结构
1. CNN部分:CNN首先处理输入数据(如图像),通过多层的卷积、池化操作提取出多尺度的特征表示。这些特征保留了图像的空间结构信息。
2. 渐征向量:在经过CNN的最后一层 (通常是展平后的特征图或全连接层),我们得到一个高维特征向量x。
3. SVM分类器:将CNN提取的特征向量输入到SWM模型中进行分类。SWM通过计算样本到超平面的距离来确定其所属类别。SVM部分可以用线性或核SVM,具体取决于数据的分布和复杂性。
3.2 CNN-SVM的数学表示
设 是CNN对输入图像$I$提取的特征向量。然后,我们使用SVM进行分类:
其中w和b是SVM模型的参数。SVM将学习如何在特征空间中找到一个超平面来区分不同类别的样本。
3.3 部分代码
%% 定义卷积神经网络结构
cnn_architecture = [
imageInputLayer([size(scaled_train_input, 1) 1 1], "Name", "input_layer")
convolution2dLayer([3, 1], 16, 'Padding', 'same') % 3x1 卷积核,生成16个通道
batchNormalizationLayer % 批量归一化
reluLayer % ReLU 激活层
maxPooling2dLayer([2, 1], 'Stride', 1) % 最大池化层,步长为1
convolution2dLayer([2, 1], 32) % 2x1 卷积核,生成32个通道
batchNormalizationLayer % 批量归一化
reluLayer % ReLU 激活层
maxPooling2dLayer([2, 1], 'Stride', 1) % 第二层池化,步长为1
fullyConnectedLayer(25) % 全连接层,25个神经元
reluLayer % ReLU 激活层
fullyConnectedLayer(1) % 输出层
regressionLayer % 回归层用于计算损失
];
%% 设置训练选项
train_options = trainingOptions('adam', ...
'MaxEpochs', 150, ...
'GradientThreshold', 1, ...
'InitialLearnRate', 0.01, ...
'LearnRateSchedule', 'piecewise', ...
'LearnRateDropPeriod', 70, ...
'LearnRateDropFactor', 0.1, ...
'L2Regularization', 0.001, ...
'ExecutionEnvironment', 'cpu', ...
'Verbose', 1, ...
'Plots', 'none');
%% 训练CNN模型
tic
trained_cnn = trainNetwork(reshaped_input_train, target_train', cnn_architecture, train_options);
toc
%% 提取CNN特征
selected_layer_name = 'pool2';
train_features = activations(trained_cnn, reshaped_input_train, selected_layer_name, 'OutputAs', 'rows');
test_features = activations(trained_cnn, reshaped_input_test, selected_layer_name, 'OutputAs', 'rows');
%% 转换为双精度
train_features = double(train_features);
test_features = double(test_features);
output_train = double(output_train);
output_test = double(output_test);
%% SVM训练与预测
opt_c = 0.01;
opt_g = 150;
svm_command = [' -s 4 -t 0 -c ', num2str(opt_c), ' -g ', num2str(opt_g)];
svm_model = libsvmtrain(output_train', train_features, svm_command);
[train_predictions, train_accuracy, ~] = libsvmpredict(output_train', train_features, svm_model);
[test_predictions, test_accuracy, ~] = libsvmpredict(output_test', test_features, svm_model);
%% 反归一化
train_predictions_denorm = mapminmax('reverse', train_predictions, output_norm_params);
test_predictions_denorm = mapminmax('reverse', test_predictions, output_norm_params);
1.均方差(MSE):0.26575
2.根均方差(RMSE):0.51551
3.平均绝对误差(MAE):0.34579
4.平均相对百分误差(MAPE):2.6756%
5.R2:99.1024%
…………测试集误差指标…………
1.均方差(MSE):0.30155
2.根均方差(RMSE):0.54913
3.平均绝对误差(MAE):0.39407
4.平均相对百分误差(MAPE):3.0429%
5.R2:98.9411%