目錄
背影
卷積神經網絡CNN的原理
卷積神經網絡CNN的定義
卷積神經網絡CNN的神經元
卷積神經網絡CNN的激活函數
卷積神經網絡CNN的傳遞函數
卷積神經網絡CNN手寫體識别
基本結構
主要參數
MATALB代碼
結果圖
展望
背影
現在生活,各種人工智能都要求對圖像擁有識别的能力,本文主要做卷積神經網絡CNN進行手寫體分類識别,通過調試參數,提高識别率。
卷積神經網絡CNN的原理
卷積神經網絡CNN的定義
卷積神經網絡(Convolutional Neural Networks, CNN)是一類包含卷積計算且具有深度結構的前饋神經網絡(Feedforward Neural Networks),是深度學習(deep learning)的代表算法之一 。卷積神經網絡具有表征學習(representation learning)能力,能夠按其階層結構對輸入資訊進行平移不變分類(shift-invariant classification),是以也被稱為“平移不變人工神經網絡(Shift-Invariant Artificial Neural Networks, SIANN)”
卷積神經網絡CNN的基本結構
基本BP算法包括信号的前向傳播和誤差的反向傳播兩個過程。即計算誤差輸出時按從輸入到輸出的方向進行,而調整權值和門檻值則從輸出到輸入的方向進行。正向傳播時,輸入信号通過隐含層作用于輸出節點,經過非線性變換,産生輸出信号,若實際輸出與期望輸出不相符,則轉入誤差的反向傳播過程。誤差反傳是将輸出誤差通過隐含層向輸入層逐層反傳,并将誤差分攤給各層所有單元,以從各層獲得的誤差信号作為調整各單元權值的依據。通過調整輸入節點與隐層節點的聯接強度和隐層節點與輸出節點的聯接強度以及門檻值,使誤差沿梯度方向下降,經過反複學習訓練,确定與最小誤差相對應的網絡參數(權值和門檻值),訓練即告停止。此時經過訓練的神經網絡即能對類似樣本的輸入資訊,自行處理輸出誤差最小的經過非線形轉換的資訊。
輸入層
卷積神經網絡的輸入層可以處理多元資料,常見地,一維卷積神經網絡的輸入層接收一維或二維數組,其中一維數組通常為時間或頻譜采樣;二維數組可能包含多個通道;二維卷積神經網絡的輸入層接收二維或三維數組;三維卷積神經網絡的輸入層接收四維數組 。由于卷積神經網絡在計算機視覺領域應用較廣,是以許多研究在介紹其結構時預先假設了三維輸入資料,即平面上的二維像素點和RGB通道。
與其它神經網絡算法類似,由于使用梯度下降算法進行學習,卷積神經網絡的輸入特征需要進行标準化處理。具體地,在将學習資料輸入卷積神經網絡前,需在通道或時間/頻率維對輸入資料進行歸一化,若輸入資料為像素,也可将分布于 的原始像素值歸一化至 區間 。輸入特征的标準化有利于提升卷積神經網絡的學習效率和表現。
隐含層
卷積神經網絡的隐含層包含卷積層、池化層和全連接配接層3類常見構築,在一些更為現代的算法中可能有Inception子產品、殘差塊(residual block)等複雜構築。在常見構築中,卷積層和池化層為卷積神經網絡特有。卷積層中的卷積核包含權重系數,而池化層不包含權重系數,是以在文獻中,池化層可能不被認為是獨立的層。以LeNet-5為例,3類常見構築在隐含層中的順序通常為:輸入-卷積層-池化層-全連接配接層-輸出。
卷積層
卷積層的功能是對輸入資料進行特征提取,其内部包含多個卷積核,組成卷積核的每個元素都對應一個權重系數和一個偏差量(bias vector),類似于一個前饋神經網絡的神經元(neuron)。卷積層内每個神經元都與前一層中位置接近的區域的多個神經元相連,區域的大小取決于卷積核的大小,在文獻中被稱為“感受野(receptive field)”,其含義可類比視覺皮層細胞的感受野 。卷積核在工作時,會有規律地掃過輸入特征,在感受野内對輸入特征做矩陣元素乘法求和并疊加偏差量
池化層(pooling layer)
在卷積層進行特征提取後,輸出的特征圖會被傳遞至池化層進行特征選擇和資訊過濾。池化層包含預設定的池化函數,其功能是将特征圖中單個點的結果替換為其相鄰區域的特征圖統計量。池化層選取池化區域與卷積核掃描特征圖步驟相同,由池化大小、步長和填充控制
全連接配接層(fully-connected layer)
卷積神經網絡中的全連接配接層等價于傳統前饋神經網絡中的隐含層。全連接配接層位于卷積神經網絡隐含層的最後部分,并隻向其它全連接配接層傳遞信号。特征圖在全連接配接層中會失去空間拓撲結構,被展開為向量并通過激勵函數
輸出層
卷積神經網絡中輸出層的上遊通常是全連接配接層,是以其結構和工作原理與傳統前饋神經網絡中的輸出層相同。對于圖像分類問題,輸出層使用邏輯函數或歸一化指數函數(softmax function)輸出分類标簽 。在物體識别(object detection)問題中,輸出層可設計為輸出物體的中心坐标、大小和分類 。在圖像語義分割中,輸出層直接輸出每個像素的分類結果
基于卷積神經網絡CNN的手寫體識别
基本模型
建立經典的Lenet,三層神經網絡,
神經網絡參數
卷積核33,池化層22,學習率0.5,訓練批次20,最大疊代次數200
MATLAB程式設計代碼
clear
clc
close all
% format compact
%% 加載資料
load maydata.mat
% load MNISTdata.match
% ann_data
[input,inputps]=mapminmax(ann_data,-1,1);
[output,outputps]=mapminmax(ann_label,0,1);
% [input,inputps]=mapminmax(ann_data,0,1);
% [output,outputps]=mapminmax(ann_label,0,1);
%%
input1=input’;%
input = [input1 input1(:,10)];
%%
for i=1:size(input,1)
x=reshape(input(i,:),6,6);
input_x(:,:,i)=x;
end
%%
n = randperm(5000);
train_x=input_x(:,:,n);
train_y=output(:,n);
test_x=input_x(:,:,n(4501:5000));
test_y=output(:,n(4501:5000));
%% 建立一個經典Lenet(卷積神經網絡中代表模型,如lenet、alexnet,vgg16,resnet等)
% rand(‘state’,0)
cnn.layers = {
%第一層
struct(‘type’, ‘i’) %輸入層
%第二層
struct(‘type’, ‘c’, ‘outputmaps’, 9, ‘kernelsize’, 3) %卷積層–相當于隐含層節點為9
% 卷積後的圖像大小為(4-3+1)(4-3+1)=22
struct(‘type’, ‘s’, ‘scale’, 2) %池化層 利用一個22的池化層把卷積後的圖像降維原來的一半
% (2/2)(2/2)=1*1
};
%% 訓練 CNN
% 參數設定
opts.alpha = 0.5;% 學習率
opts.batchsize = 20; %批訓練大小 batchsize整數倍必須是總訓練樣本大小,選擇更小的批資料 這樣計算的更快,電腦所需記憶體也會大幅減小
opts.numepochs = 200;%學習疊代次數
cnn = cnnsetup(cnn, train_x, train_y);
cnn = cnntrain(cnn, train_x, train_y, opts);
% % 訓練誤差曲線
figure
plot(cnn.rL)
xlabel(‘訓練次數次數’)
ylabel(‘誤差’)
title(‘訓練誤差曲線’)
%% 測試模型有效性
% load net_cnn
% 訓練集
% [er1, bad1 , a1, h1] = cnntest(cnn, train_x, train_y);
% h1=(mapminmax(‘reverse’,h1,outputps));
% a1=(mapminmax(‘reverse’,a1,outputps));
% disp(‘展示CNN訓練集精度’)
% figure
% plot(h1,‘r-o’)
% hold on
% plot(a1,‘k–')
% legend(‘預測輸出’,‘期望輸出’)
% xlabel(‘樣本數/個’)
% ylabel(‘标簽類别’)
% title(‘CNN網絡輸出與期望輸出對比–訓練集’)
% 測試集
[er2, bad2 , a2, h2] = cnntest(cnn, test_x, test_y);
% disp(‘展示CNN測試集精度’)
[~,h2]=max(mapminmax(‘reverse’,h2,outputps));
[~,a2]=max(mapminmax(‘reverse’,a2,outputps));
[a2,mx] = sort(a2);
h2 = h2(mx);
figure
plot(a2(1,:),'r-’)
hold on
plot(h2(1,:),‘b-o’)
hold off
legend(‘期望輸出’,‘預測輸出’)
xlabel(‘樣本’)
ylabel(‘PPX’)
title(‘CNN網絡輸出與期望輸出對比–測試集’)
figure
plot(er2(1,:),‘k-*’)
ylabel(‘PPX誤差’)
zhunquelv = sum(a2==h2)/length(h2)
function net = cnntrain(net, x, y, opts)
m = size(x, 3);
numbatches = m / opts.batchsize;
if rem(numbatches, 1) ~= 0
error(‘numbatches not integer’);
end
net.rL = [];
for i = 1 : opts.numepochs
disp(['epoch ' num2str(i) '/' num2str(opts.numepochs)]);
tic;
kk = randperm(m);
for l = 1 : numbatches
batch_x = x(:, :, kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize));
batch_y = y(:, kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize));
net = cnnff(net, batch_x);
net = cnnbp(net, batch_y);
net = cnnapplygrads(net, opts);
if isempty(net.rL)
net.rL(1) = net.L;
end
net.rL(end + 1) = 0.85 * net.rL(end) + 0.15 * net.L;
end
toc;
end
end
function [er, aa, h,y] = cnntest(net, x, y1)%,outputps,outputps
% feedforward
an = cnnff(net, x);
% h = mapminmax(‘reverse’,an.o,outputps);
% y = mapminmax(‘reverse’,y1,outputps);
h = an.o;
y = y1;
er = h-y;
aa = sum(sum(abs(er./h)))/(size(er,1)*size(er,2));
end
效果圖
結果分析
從效果圖上看,CNN卷積神經網絡分類準确率可達到百分子80以上。
展望
CNN是一種深度信念網絡,優點在可以處理大輸入資料,能訓練中自動降維,訓練的過程就是降維的過程,缺點是拟合逼近能力不強,收斂面比較平滑,基于這些,可以和其他拟合能力強的神經網絡結合,比如極限學習機,RBF等,結合後的神經網絡,即可處理大輸入資料,又具有無限逼近的能力