目录
背影
卷积神经网络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等,结合后的神经网络,即可处理大输入数据,又具有无限逼近的能力