一、什么是卷积神经网络?
卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,在图像和语音识别方面得到了广泛应用。卷积神经网络的主要特点在于它们能够处理具有层次结构的输入数据,其中“卷积”这一操作使得不同的过滤器可以提取具有特定意义的特征。
卷积神经网络的输入层通常为图像像素,中间层使用卷积和池化操作来提取图像的特征,输出层是分类器。
function cnnDemo
% 将样本图像装在imageDatastore中
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
'nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders',true,'LabelSource','foldernames');
% 将每张图像的大小重置为28 x 28像素
imds.ReadFcn = @readFunctionTrain;
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
% 可视化数据集的一部分图像
figure
for i = 1:16
subplot(4,4,i);
I = readimage(imdsTrain,idx(i));
imshow(I);
end
% 创建卷积神经网络(CNN)
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20)
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
% 设置训练选项
options = trainingOptions('sgdm', ...
'MaxEpochs',4, ...
'ValidationData',imdsValidation, ...
'ValidationFrequency',30, ...
'Verbose',false, ...
'Plots','training-progress');
% 训练CNN
net = trainNetwork(imdsTrain,layers,options);
end
function I = readFunctionTrain(filename)
% 将RGB图像转换为灰度图像
I = imread(filename);
if ismatrix(I)
I = cat(3,I,I,I);
end
end
二、卷积层
卷积层是卷积神经网络的基本层之一,其意义在于利用卷积核对原图像进行卷积操作,从中提取出特定的特征。在Matlab中可以使用convolution2dLayer函数构建卷积层。
卷积层的参数包含卷积核大小,步幅以及填充等,这些参数的调节可以达到更好的特征提取效果。
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20) % 5 x 5卷积核,20个过滤器
reluLayer % 激活层
maxPooling2dLayer(2,'Stride',2) % 2 x 2最大池化,步幅2
fullyConnectedLayer(10) % 全连接层
softmaxLayer % 分类层
classificationLayer]; % 采用交叉熵作为代价函数
三、池化层
池化层也是卷积神经网络常用的一种中间层,其作用是在进行卷积操作后,在一定范围内求取激活值的最大值或者平均值,从而起到特征压缩的作用,并且减小过拟合的风险。
在Matlab中可以使用maxPooling2dLayer函数构建池化层,同样包括步幅和池化大小等参数。
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20)
reluLayer
maxPooling2dLayer(2,'Stride',2) % 2 x 2最大池化
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
四、全连接层
全连接层是一个标准的神经网络层,其每个输出值是由所有输入值加权求和后进行激活函数处理而得到。在卷积神经网络中,全连接层主要负责将池化层输出的特征图转换为分类结果。
在Matlab中可以使用fullyConnectedLayer函数构建全连接层,其中的参数表示输出的类别数量。
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20)
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(10) % 输出10个类别
softmaxLayer
classificationLayer];
五、Softmax层
Softmax层是一个常用的多分类学习函数,在分类问题中被广泛应用。在Matlab卷积神经网络中,输出层通常使用softmax层进行数据归一化,将输出转换为概率值并计算交叉熵等代价函数。
同样在Matlab中可以使用softmaxLayer函数构建softmax层。
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20)
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(10)
softmaxLayer % softmax输出层
classificationLayer];
六、交叉熵
交叉熵是神经网络中常用的一种代价函数,用来表示模型预测值和实际标签值之间的误差。其取值越小表示模型拟合效果越好。在Matlab中可以使用交叉熵作为代价函数,通常与softmax层一起出现。
在上述代码中,使用了交叉熵作为分类层的代价函数。
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20)
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(10)
softmaxLayer % softmax输出层
classificationLayer]; % 采用交叉熵作为代价函数
七、总结
卷积神经网络是使用卷积层、池化层、全连接层、Softmax层等组成的神经网络,主要用于图像识别、语音识别等领域。在Matlab中,可以使用多个函数快速构建CNN模型,同时也支持多种有效的代价函数来进行训练优化,还可以使用GPU加速等方式提高训练速度。