卷积神经网络(Convolutional Neural Networks, CNNs)简介
卷积神经网络是一种特殊类型的深度前馈神经网络,主要用于处理具有类似网格结构的数据,如图像。CNN 通过使用卷积层来模拟人脑对视觉信息的处理方式,从而能够学习到图像中的局部空间层次特征。
CNN 的主要组成部分包括:
- 卷积层(Convolutional Layer):通过多个可学习的卷积核对输入进行卷积操作,提取图像中的局部特征。
- 激活函数(Activation Function):将卷积层的输出进行非线性变换,增加网络的非线性表达能力。常用的激活函数有 ReLU、Sigmoid、Tanh 等。
- 池化层(Pooling Layer):对卷积层的输出进行下采样,减少数据的空间尺寸,降低计算复杂度,同时提取主要特征。常见的池化操作有最大池化(Max Pooling)和平均池化(Average Pooling)。
- 全连接层(Fully Connected Layer):在卷积层和池化层之后,通常会使用全连接层(也称为密集层或线性层)来整合前面提取的特征,并输出最终的分类或回归结果。
- 输出层(Output Layer):根据任务类型(分类或回归),使用适当的损失函数(如交叉熵损失、均方误差损失等)来计算预测结果与实际结果之间的差距,并通过反向传播算法来更新网络参数。
MATLAB 实现卷积神经网络的例子
MATLAB 提供了深度学习工具箱(Deep Learning Toolbox),使得用户可以方便地构建和训练 CNN 模型。以下是一个简单的例子,展示如何在 MATLAB 中使用深度学习工具箱来构建和训练一个用于图像分类的 CNN 模型。
-
导入数据:首先,你需要导入用于训练和测试的数据集。MATLAB 提供了 ImageDatastore 类来方便地管理图像数据。
matlab复制代码
% 假设你有一个名为 'trainImages' 的文件夹,其中包含训练图像 | |
% 以及一个名为 'trainLabels' 的文本文件,其中包含对应的标签 | |
imdsTrain = imageDatastore('trainImages', ... | |
'IncludeSubfolders',true, ... | |
'LabelSource','foldernames'); | |
% 类似地,你可以为测试数据创建 ImageDatastore 对象 | |
imdsTest = imageDatastore('testImages', ... | |
'IncludeSubfolders',true, ... | |
'LabelSource','foldernames'); |
2.定义网络结构:使用 layers 函数来定义 CNN 的结构。以下是一个简单的例子:
matlab复制代码
layers = [ | |
imageInputLayer([None None 3]) % 输入层,假设输入图像是 RGB 图像 | |
convolution2dLayer(3,8,'Padding','same') % 卷积层,3x3 卷积核,8 个滤波器 | |
batchNormalizationLayer % 批归一化层 | |
reluLayer % ReLU 激活函数 | |
maxPooling2dLayer(2,'Stride',2) % 最大池化层,2x2 池化窗口,步长为 2 | |
convolution2dLayer(3,16,'Padding','same') % 另一个卷积层 | |
batchNormalizationLayer | |
reluLayer | |
maxPooling2dLayer(2,'Stride',2) % 另一个最大池化层 | |
fullyConnectedLayer(numClasses) % 全连接层,numClasses 是类别数 | |
softmaxLayer % Softmax 激活函数用于多分类问题 | |
classificationLayer % 分类输出层 | |
]; |
3.配置训练选项:使用 trainingOptions 函数来配置训练选项,如学习率、迭代次数等。
matlab复制代码
options = trainingOptions('sgdm', ... | |
'InitialLearnRate',0.01, ... | |
'MaxEpochs',10, ... | |
'Shuffle','every-epoch', ... | |
'ValidationData',{imdsTest,labelsTest}, ... % 假设你有一个名为 'labelsTest' 的变量来存储测试标签 | |
'ValidationFrequency',30, ... | |
'Verbose',false, ... | |
'Plots','training-progress'); |
4.训练网络:使用 trainNetwork 函数来训练网络。
matlab复制代码
net = trainNetwork(imdsTrain,layers,options); |
5.评估网络:使用 classify 或 predict 函数来评估网络在测试集上的性能。
matlab复制代码
YPred = classify(net,imdsTest); | |
% 或者,如果你需要预测概率而不是类别标签 | |
YPredProb = predict(net,imdsTest); |