卷积神经网络(Convolutional Neural Network,CNN)是机器学习中广泛使用的一类深度神经网络。该网络模型以卷积运算为基础,通过自适应地学习特征和模式,从输入数据中抽取越来越复杂的特征,以实现对目标的准确分类、识别和检测等任务。Matlab作为一种强大的科学计算软件,已经成为大量机器学习工程师和科学家的首选工具之一,也提供了一系列优秀的神经网络框架和相关函数库,方便用户自定义和生成卷积神经网络模型,完成训练和优化等任务。
一、 卷积神经网络的基本原理
卷积神经网络是基于人类视觉系统的工作原理设计的,因此具有自适应性和特异性。其中,卷积(convolution)是一种重要的运算,它将输入的数据特征(input feature)和一组“卷积核(convolution kernel)”或称为“滤波器(filter)”进行卷积操作,从而生成输出的特征映射(feature map)。具体而言,卷积操作可以表达为:
在该式中,输入数据的维数为X∈R^H×W×D,其中H、W、D分别表示数据的高度、宽度和深度(即通道数)。W∈R^K×K×D为卷积核参数,K表示卷积核的大小(一般为正方形),D表示卷积核的深度,即卷积核的数目。不同的卷积核会产生不同的卷积特征,例如边缘检测或纹理识别等。对于一层卷积层,我们会训练若干个卷积核,使得它们能够学会适应数据的特征分布,提取更加复杂的、具有语义的特征。
卷积神经网络一般由多层卷积层、激活层、汇聚层和全连接层等组成。其中,激活层用来处理非线性问题,常用的激活函数包括Sigmoid、ReLU、Tanh、 Leaky ReLU等。汇聚层用于缩小特征图尺寸,即将卷积层输出的特征图进行降采样,从而减少网络的模型复杂度和过拟合情况。而全连接层则用于对抽取出的特征进行分类和回归操作,常用的分类器包括Softmax和SVM。此外,CNN中的参数学习和优化采用了反向传播算法(Backpropagation),即利用误差反向传递,调整卷积核和偏差(bias)的大小,以提高网络的性能和泛化能力。
二、 Matlab中常见的卷积神经网络函数
Matlab中提供了丰富的卷积神经网络函数库,方便用户快速构建和训练自己的神经网络模型。下面简要介绍几种常见的网络函数和相关参数设置。
1. convolution2dLayer 函数
该函数用于创建2D卷积层。
卷积层是CNN中最重要的一部分,其参数包括卷积核大小、步长、填充等。常用的函数调用格式为:
convolution2dLayer(filterSize,numFilters,'Name',Value)
其中,filterSize表示卷积核大小,一般取3或5;numFilters表示卷积核的个数,即卷积层数目;Name-Value对可以选择如下参数:
Padding:填充方式(‘same’或‘valid’)。
Stride:步长。
DilationFactor:膨胀因子。
WeightsInitializer:权重初始化方法。
BiasInitializer:偏差初始化方法。
Activation:激活函数。
2. maxPooling2dLayer 函数
该函数用于创建2D最大汇聚层。
汇聚层的作用是将卷积层输出的特征图进行下采样,以减少模型的复杂度并控制过拟合。常用的函数调用格式为:
maxPooling2dLayer(poolSize,'Name',Value)
其中,poolSize表示汇聚区域的大小,常取2或3;Name-Value对可以选择如下参数:
Stride:步长。
Padding:填充方式(‘same’或‘valid’)。
3. fullyConnectedLayer 函数
该函数用于创建全连接层。
全连接层用于连接卷积神经网络的特征表达和输出,并进行分类或回归操作。常用的函数调用格式为:
fullyConnectedLayer(numHiddenUnits,'Name',Value)
其中,numHiddenUnits表示隐藏单元数目;Name-Value对可以选择如下参数:
WeightsInitializer:权重初始化方法。
BiasInitializer:偏差初始化方法。
Activation:激活函数。
4. softmaxLayer 函数
该函数用于创建Softmax分类器。
Softmax分类器是CNN中广泛用于分类问题的一个分类器。常用的函数调用格式为:
softmaxLayer('Name',Value)
Name-Value对可以选择如下参数:
LossFunction:损失函数。
5. trainNetwork 函数
该函数用于训练CNN。
训练网络是模型开发的核心任务之一,Matlab提供了丰富的训练函数和调用接口,包括trainNetwork、trainlm、trainbr和trainscg等函数。其中,trainNetwork比较简单易用,常用的调用格式为:
trainedNet = trainNetwork(XTrain,YTrain,layers,options)
其中,XTrain和YTrain分别表示训练样本和目标,layers表示网络结构,options表示训练选项,常用的训练选项包括:
MiniBatchSize:小批量梯度下降的批量大小。
MaxEpochs:最大训练轮数。
Shuffle:是否随机打乱训练样本。
Momentum:动量参数。
InitialLearnRate:初始学习率。
然后,利用训练好的模型对测试集进行评估和预测即可。
三、 实例分析:手写数字识别
下面,以手写数字识别为例,展示如何使用Matlab创建和训练卷积神经网络模型。具体而言,我们将使用MNIST手写数字库,包含60,000个训练样本和10,000个测试样本,每个样本为28×28像素的灰度图像,目标为0~9共10个数字。基于该数据集,我们将创建一个三层卷积神经网络,包括两层卷积+两层汇聚和一层全连接层+Softmax分类器。
1. 数据预处理
我们首先需要将MNIST数据集导入Matlab中,并进行预处理,其中,包括将原始的图像数据集转换为网络模型可接受的张量(tensor),并进行数据归一化和划分等操作。具体而言,我们可以使用Matlab自带的先进图像处理工具箱来实现这些操作,如下所示:
imdsTrain = imageDatastore('train-images.idx3-ubyte','ReadFcn',@readMNISTimage);
labeldsTrain = imageDatastore('train-labels.idx1-ubyte','ReadFcn',@readMNISTlabel);
imdsTest = imageDatastore('t10k-images.idx3-ubyte','ReadFcn',@readMNISTimage);
labeldsTest = imageDatastore('t10k-labels.idx1-ubyte','ReadFcn',@readMNISTlabel);
function img = readMNISTimage(filename)
fp = fopen(filename,'rb','ieee-be');
assert(fp ~= -1, ['Could not open ',filename,'.']);
magic = fread(fp,1,'int32',0,'ieee-be');
assert(magic == 2051, ['Bad magic number in ',filename,'.']);
numImages = fread(fp,1,'int32',0,'ieee-be');
numRows = fread(fp,1,'int32',0,'ieee-be');
numCols = fread(fp,1,'int32',0,'ieee-be');
img = fread(fp,numRows*numCols*numImages,'uchar',0,'ieee-be');
img = reshape(img,numCols,numRows,numImages);
img = permute(img,[2 1 3]);
fclose(fp);
end
function label = readMNISTlabel(filename)
fp = fopen(filename,'rb','ieee-be');
assert(fp ~= -1, ['Could not open ',filename,'.']);
magic = fread(fp,1,'int32',0,'ieee-be');
assert(magic == 2049, ['Bad magic number in ',filename,'.']);
numLabels = fread(fp,1,'int32',0,'ieee-be');
label = fread(fp,numLabels,'uchar',0,'ieee-be');
fclose(fp);
end
XTrain = readall(imdsTrain);
YTrain = readall(labeldsTrain);
XTest = readall(imdsTest);
YTest = readall(labeldsTest);
% Normalize data
XTrain = double(XTrain)/255;
XTest = double(XTest)/255;
% Split dataset into training and validation sets
dataSize = size(XTrain,1);
trainSize = round(dataSize*0.9);
idx = randperm(dataSize);
XTrain = XTrain(idx(1:trainSize),:,:);
YTrain = categorical(YTrain(idx(1:trainSize)));
XValidation = XTrain(idx(trainSize+1:end),:,:);
YValidation = categorical(YTrain(idx(trainSize+1:end)));
YTest = categorical(YTest);
其中,readMNISTimage和readMNISTlabel分别用于按照指定格式读取MNIST图像数据集和标签数据集。接下来,我们将数据集分为训练集、验证集和测试集三部分,以便进行模型的训练和评估。
2. 创建和训练CNN模型
基于上述数据预处理结果,我们可以使用Matlab提供的卷积神经网络函数库来创建和训练CNN模型。具体而言,我们可以按照如下步骤完成:
(1)定义网络结构变量layers。
layers = [
imageInputLayer([28 28 1],'Normalization','zscore')
convolution2dLayer(5,32,'Padding',1,'BiasLearnRateFactor',2)
reluLayer()
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(5,64,'Padding',1,'BiasLearnRateFactor',2)
reluLayer()
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(1024,'BiasLearnRateFactor',2)
reluLayer()
dropoutLayer()
fullyConnectedLayer(10)
softmaxLayer()
classificationLayer()
];
(2)配置训练选项options。
options = trainingOptions('adam','MaxEpochs',10,'MiniBatchSize',128,...
'ValidationData',{XValidation,YValidation},'ValidationFrequency',30,...
'InitialLearnRate',0.0001,'LearnRateSchedule', 'piecewise', 'LearnRateDropFactor', 0.2,'LearnRateDropPeriod', 5,'Plots','training-progress');
其中,我们选择Adam优化器、设置最大训练轮数10,小批量大小128,学习率初始值为0.0001,学习率变化规则为piecewise分段线性规则,每5个轮次降低学习率0.2倍。
(3)使用trainNetwork函数对CNN模型进行训练。
CNNModel = trainNetwork(XTrain, YTrain, layers, options);
其中,CNNModel表示训练好的CNN模型。训练过程中,系统还会输出训练进度和每个轮次的损失和准确率等信息,我们可以通过Matlab自带的可视化工具箱进行训练结果的绘制和分析,如下所示:
figure
plot(lossTrain,'green');
hold on
plot(lossValid,'blue');
ylabel('Loss')
xlabel('Iteration')
legend('Train Loss','Validation Loss')
title('Loss During the Training')
figure
plot(accTrain,'green');
hold on
plot(accValid,'blue');
ylabel('Accuracy')
xlabel('Iteration')
legend('Train Accuracy','Validation Accuracy')
title('Accuracy During the Training')
(4)使用trainedModel = classify(CNNModel, XTest) 函数对测试集进行分类,并计算分类准确率。
YPred = classify(CNNModel,XTest);
accuracy = sum(YPred == YTest)/numel(YTest)
四、 结语
卷积神经网络作为一种强大的深度学习模型,已经成为机器学习和计算机视觉领域的核心技术之一。Matlab作为一种丰富的科学计算和机器学习工具,已经提供了丰富的卷积神经网络函数和工具库,方便用户快速搭建和训练自己的网络模型。通过上述手写数字识别的案例分析,我们可以看到,使用Matlab创建和训练CNN模型非常简单直观,几乎没有编程难度,是一种十分高效和实用的方法。当然,除了卷积神经网络模型之外,Matlab还可以支持诸如循环神经网络、深度置信网络等其他类型的深度学习模型,丰富了用户的选择和开发范围。
原创文章,作者:古哥,转载需经过作者授权同意,并附上原文链接:https://iymark.com/articles/9783.html