用matlab探索卷积神经网络(Convolutional Neural Networks)-2
文章目录
- 3.理解一个简单的神经网络结构
- 4.层与滤波器(Layers and Filters)
3.理解一个简单的神经网络结构
CNN的架构和深度各有不同。但所有的CNN都会包含一些常见的层,比如图像输入层和卷积层。
后面,我们可以看到分类网络中的每一层如何处理一个简单示例图像。
在第二部分,我们创建了一个简单的深度网络结构,如下图所示,
例:用一个矩阵的例子表示上图的流程就如下图所示
第一层是图像输入层。该层定义了网络的输入尺寸,并对输入图像进行归一化处理。默认情况下,图像输入层会减去训练数据集的平均图像,从而使图像以零为中心。上图中,输入层就是一个5x5的图像(imageInputLayer([5 5]))
二维卷积层对输入图像应用滑动滤波器。卷积层是CNN架构中的关键部分,它们利用输入图像的空间结构来提取信息。上面例子中的卷积核就是一个通道,大小为2x2,即convolution2dLayer([2 2], 1)
卷积层通常后接一个非线性激活层,例如修正线性单元(ReLU)。ReLU层对输入的每个元素执行阈值操作,将小于零的值都设为零。
最大池化层通过将输入划分为矩形的池化区域,并计算每个区域的最大值来进行下采样。池化可以降低网络的复杂度,并使网络具有更强的泛化能力。上面例子的池化层大小为3x3,即maxPoolingLayer([3 3])
通过网络传递的特征被保存在一组矩阵中,直到它们到达全连接层。在全连接层中,输入会被“展平”,以便映射到输出类别上。该层的输出大小取决于你的分类问题中的类别数量。例如,如果你要对猫和狗进行分类,输出大小就是2。
Softmax层将每个输出类别的数值转换为归一化的分数。你可以将每个数值理解为输入图像属于对应类别的概率。
Softmax层中数值最大的那个对应于最有可能的类别。
4.层与滤波器(Layers and Filters)
当你创建一个卷积层时,需要指定滤波器的尺寸和数量。在训练过程中,这些滤波器会学习如何从图像中提取特征。为了帮助理解滤波器的作用,你可以将一张输入图像传入网络,并查看卷积层的激活值(即输出)。被网络处理过的图像称为激活图。首先,我们创建自己的滤波器,以了解卷积是如何工作的。
我们可以自己找一张花朵的照片,这是一张RGB图像,有三个通道,如下图所示,
为了模拟在 convolution2dLayer
中执行的卷积操作,你需要一个二维矩阵。你可以使用冒号(:)运算符提取其中一个通道的所有行和列,这里我们提取彩色图片的第一个通道,
% 读取彩色图片
img = imread("flower.jpg");
figure,imshow(img)
% 提取图片第一个通道
redIm = img(:,:,1);
figure,imshow(redIm)
这里我们将使用的滤波器是 3×3 的矩阵。在图像处理中,这种矩阵通常被称为卷积核(kernel)。这就类似于在创建 convolution2dLayer
时使用一个 [3 3]
的滤波器。
最简单的卷积核之一是单位卷积核(identity kernel):
[
0
0
0
0
1
0
0
0
0
]
\begin{bmatrix} 0 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix}
000010000
在每个像素处,使用单位卷积核进行卷积时会返回相同的像素值。因此,输出图像与原始图像相同。
在matlab里,我们可以这样创建单位卷积核
% 单位卷积核
identityK = [0 0 0; 0 1 0; 0 0 0];
你可以使用 imfilter
函数和你的卷积核一起,对图像应用滤波操作。
filteredim = imfilter(im, kernel)
表示将滤波器 kernel
应用于图像 im
,并将结果存储在 filteredim
中。
这里我们将identityK应用在提取的第一个通道上redIm,
% 应用单位卷积核
identityConv = imfilter(redIm, identityK);
figure,imshow(identityConv)
当我们使用不用的卷积核,就会对图像有不同的效果,我们可以使用下面的卷积核来模糊图像,
1
9
[
1
1
1
1
1
1
1
1
1
]
\frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}
91
111111111
这个卷积核计算一个像素及其周围像素的平局值。
% 卷积核
blurK = 1/9 * [1 1 1; 1 1 1;1 1 1];
% 应用卷积核
blurConv = imfilter(redIm, blurK);
figure,imshow(blurConv)
边缘通常是在卷积神经网络(CNN)早期层中提取的特征之一。你可以使用这个卷积核进行简单的边缘检测。
[
0
1
0
1
−
4
1
0
1
0
]
\begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix}
0101−41010
% 卷积核
edgeK = [0 1 0; 1 -4 1;0 1 0];
% 应用卷积核
edgeConv = imfilter(redIm, edgeK);
figure,imshow(edgeConv)