CNN-SVM(卷積神經(jīng)網(wǎng)絡-支持向量機)是一種將卷積神經(jīng)網(wǎng)絡(CNN)與支持向量機(SVM)組合起來的深度學習模型。CNN-SVM模型的目標是通過結(jié)合CNN的特征提取能力和SVM的分類能力來提升圖像分類、模式識別等任務的性能。以下詳細介紹這兩種模型各自的數(shù)學原理及其組合后的工作原理。
NO.1|CNN(卷積神經(jīng)網(wǎng)絡)的數(shù)學模型
CNN是一種適用于圖像處理和其他結(jié)構(gòu)化數(shù)據(jù)的深度神經(jīng)網(wǎng)絡。其核心組成部分包括卷積層、池化層和全連接層。
1.1 卷積層的數(shù)學表示
卷積層的主要作用是從輸入數(shù)據(jù)中提取特征。假設輸入是一幅圖像I,卷積核K大小為m×n,則卷積操作可以表示為:
其中,S(i,j)是卷積操作后的輸出特征圖上的像素值。通過滑動卷積核在圖像上進行卷積操作,生成新的特征圖。多個卷積核可以捕捉圖像的不同特征,如邊緣、紋理等。
1.2 池化層的數(shù)學表示
池化層 (Pooling)通常用來減少特征圖的大小,從而減小計算量并增加模型的魯棒性。最常見的池化操作是最大池化(Max Pooling),其數(shù)學表示為:
這里,P(i,j)是池化后的輸出,池化窗口選取了輸入特征圖$S(i,j)$上的一個小塊區(qū)域,通過最大值或平均值等方式進行降維。
1.3 全連接層
全連接層將來自卷積和池化后的特征展平為向量,并通過權(quán)重矩陣W和偏置項b進行線性變換:
x是輸入的展平特征向量,z是全連接層的輸出。最后,這些輸出通過激活函數(shù)(如ReLU或Softmax) 得到最終的分類結(jié)果。
NO.2|SVM(支持向量機)的數(shù)學模型
SVM是一種用于二分類問題的監(jiān)督學習模型,其核心思想是通過找到一個最優(yōu)的超平面來將不同類別的數(shù)據(jù)分開。對給定的訓練數(shù)據(jù)??,其中xi是輸入向量,??表示類別標簽。SVM試圖找到一個超平面:
其中,w是權(quán)重向量,b是偏置項。為了找到最優(yōu)的超平面,SVM的目標是最大化超平面到兩類數(shù)據(jù)的最小距離,這轉(zhuǎn)化為一個優(yōu)化問題:
同時滿足約束條件:
當數(shù)據(jù)不完全線性可分時,可以引入松弛變量$xi_{i}$ 來允許一些數(shù)據(jù)點被錯誤分類:
其中C是調(diào)節(jié)懲罰項的超參數(shù)。對于非線性可分問題,SWM誦過使用核函數(shù)將數(shù)據(jù)映的到高維空間,使其線性可分。常見的核函數(shù)有線性核、多項式核和RBF核。
NO.3|CNN-SVM組合模型
CNN-SVM模型結(jié)合了CNN的特征提取能力和SVW的強分類能力。其基本思路是使用CNN進行特征提取,然后將這些提取到的高維持征輸入到SWM進行分類。與直接使用CNN的全連接層和Softmax分類器相比,SVM分類器能夠更好地處理高維特征空間中的復雜分類問題。
3.1 CNN-SVM模型的結(jié)構(gòu)
1. CNN部分:CNN首先處理輸入數(shù)據(jù)(如圖像),通過多層的卷積、池化操作提取出多尺度的特征表示。這些特征保留了圖像的空間結(jié)構(gòu)信息。
2. 漸征向量:在經(jīng)過CNN的最后一層 (通常是展平后的特征圖或全連接層),我們得到一個高維特征向量x。
3. SVM分類器:將CNN提取的特征向量輸入到SWM模型中進行分類。SWM通過計算樣本到超平面的距離來確定其所屬類別。SVM部分可以用線性或核SVM,具體取決于數(shù)據(jù)的分布和復雜性。
3.2 CNN-SVM的數(shù)學表示
設??是CNN對輸入圖像$I$提取的特征向量。然后,我們使用SVM進行分類:
其中w和b是SVM模型的參數(shù)。SVM將學習如何在特征空間中找到一個超平面來區(qū)分不同類別的樣本。
3.3 部分代碼
%% 定義卷積神經(jīng)網(wǎng)絡結(jié)構(gòu)
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個神經(jīng)元
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');
%% 轉(zhuǎn)換為雙精度
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%