初识卷积神经网络第一讲!
目录
- 什么是CNN?
- 我们为什么要使用CNN?
- 几个定义
- CNN中的图层
- Keras实现
1.什么是CNN?
计算机视觉日新月异的其中一个原因是深度学习。当我们谈论计算机视觉时,我们会想到一个术语,卷积神经网络(缩写为CNN),因为CNN会在这一领域被大量使用。计算机视觉中CNN的例子是人脸识别、图像分类等。它类似于基本的神经网络。 CNN还有可学习的参数,如神经网络,即权重、偏差等。
2.我们为什么要使用CNN?
前馈神经网络问题
假设您正在使用MNIST数据集,您知道MNIST中的每个图像都是28 x 28 x 1(黑白图像只包含1个通道)。输入层中的神经元总数将为28 x 28 = 784,这是可以管理的。如果图像的大小是1000 x 1000,这意味着你在输入层需要10⁶个神经元。这似乎是在操作中需要大量神经元。它在计算上无效,这就是卷积神经网络。简单来说,CNN所做的就是提取图像的特征并将其转换为较低的维度的图像,而不会失去其特征。在下面的例子中,你可以看到初始图像的大小是224 x 224 x 3,如果你不继续卷积,那么你需要224 x 224 x 3 = 100,352个输入层的神经元数量,但是在应用卷积后,你输入张量维数减少到1 x 1 x 1000。这意味着你只需要第一层前馈神经网络中的1000个神经元。
3.几个定义
在理解CNN之前,您应该了解的定义很少
3.1图像表示
考虑到图像,很容易理解它有高度和宽度,因此用二维结构(矩阵)表示包含在其中的信息是有意义的,直到你记住图像有颜色,并添加有关图像的信息颜色,那就是当张量变得特别有用时,我们需要另一个维度。
图像被编码成颜色通道,图像数据在给定点的颜色通道中表示为每种颜色强度,最常见的是RGB,这意味着红色、蓝色和绿色。图像中包含的信息是每个通道颜色的强度转换成图像的宽度和高度,就像这样
因此,具有宽度和高度的每个点处的红色通道的强度可以表示为矩阵,对于蓝色和绿色通道也是如此,因此我们最终具有三个矩阵,并且当它们组合时,它们形成 tensor。
3.2边缘检测
每个图像都有垂直和水平边缘,实际上组合形成一个图像。卷积操作与一些滤波器一起用于检测边缘。假设您有尺寸为6 x 6的灰度图像和尺寸为3 x 3的滤镜(比方说)。当6 x 6灰度图像与3 x 3滤波器卷积时,我们得到4 x 4图像。首先,3 x 3滤镜矩阵乘以我们的灰度图像的前3 x 3尺寸,然后我们将一列向右移动到结束,之后我们移动一行,依此类推。
卷积操作
卷积操作可以通过以下方式可视化。这里我们的图像尺寸是4 x 4,滤镜是3 x 3,因此我们在卷积为2 x 2后得到输出。
卷积的可视化
如果我们有N x N图像大小和F x F滤波器大小,那么在卷积结果之后
3.3步幅和填充
Stride表示我们在卷积的每一步骤中移动了多少步。默认情况下它是1。
与Stride 1的卷积
我们可以观察到输出的大小小于输入的大小。为了保持输出的维度,我们使用填充。填充是对称地将0添加到输入矩阵的过程。在以下示例中,额外的灰色块表示填充。它用于使输出的维度与输入相同。
假设'p'是填充
最初(没有填充)
应用填充后
应用填充后
如果我们在带有填充的(N + 2p)x(N + 2p)输入矩阵中应用滤波器F x F,那么我们将得到输出矩阵维数(N + 2p-F + 1)x(N + 2p-F + 1) 。我们知道在应用填充后,我们将获得与原始输入维度(N x N)相同的维度。因此我们有,
等式(3)清楚地表明Padding取决于滤波器的尺寸。
4.在CNN中的图层
CNN中有五个不同的层:
- 输入层
- Convo层(Convo + ReLU)
- 汇集层
- 完全连接(FC)层
- Softmax / logistic层
- 输出层
- 不同层次的CNN
4.1输入层
CNN中的输入层应包含图像数据。如前所述,图像数据由三维矩阵表示。您需要将其重塑为单个列。假设您有尺寸为28 x 28 = 784的图像,则需要在输入输入之前将其转换为784 x 1。如果你有“m”训练样例,那么输入的维数将是(784,m)。
4.2. Convo层
Convo图层有时称为特征提取图层,因为图像的特征是在此图层中提取的。首先,如前所述,图像的一部分连接到Convo层以执行卷积操作,并计算感受场之间的点积(它是输入图像的局部区域,具有与滤波器相同的大小)和过滤器。操作结果是输出量的单个整数。然后我们将滤镜移到相同输入图像的下一个接受域,再次执行相同的操作。我们将一次又一次地重复相同的过程,直到我们完成整个图像。输出将是下一层的输入。
Convo层还包含ReLU激活,以使所有负值为零。
4.3.池化层
池化层用于减少卷积后输入图像的空间体积。它用于两个卷积层之间。如果我们在Convo层之后应用FC而不应用池或最大池,那么它在计算起来会比较昂贵,并且我们不想要它。因此,最大池化只是输入图像空间体积的唯一途径。在上面的例子中,我们在单深度切片中应用了max pooling, Stride为2。你可以看到4×4维的输入被缩减为2×2维。
池化层中没有参数,但它有两个超参数——Filter(F)和Stride(S)。
通常,如果我们有输入尺寸W1 x H1 x D1,那么
W2 =(W1-F)/ S + 1
H2 =(H1-F)/ S + 1
D2 = D1
其中W2,H2和D2是输出的宽度、高度和深度。
4.4.完全连接层(FC)
完全连接的层涉及权重、偏差和神经元。它将一层中的神经元连接到另一层中的神经元。它用于通过训练对不同类别的图像进行分类。
4.5. Softmax / Logistic Layer
Softmax或Logistic层是CNN的最后一层。它位于FC层的末尾。 Logistic用于二进制分类,softmax用于多分类。
4.6.输出层
输出层包含标签,该标签采用单热编码形式。
现在你对CNN有了很好的理解。让我们在Keras实施CNN。
5.Keras实施
我们将使用CIFAR-10数据集来构建CNN图像分类器。 CIFAR-10数据集有10个不同的标签
- 飞机
- 汽车
- 鸟
- 猫
- 鹿
- 狗
- 青蛙
- 马
- 船
- 卡车
它有50,000个训练数据和10,000个测试图像数据。 CIFAR-10中的图像尺寸为32 x 32 x 3.它带有Keras库。
模型可视化
如果您使用谷歌colaboratory,那么请确保您使用的是GPU。检查GPU是否打开。请尝试以下代码。
输出:
首先,导入所有必需的模块和库。
然后加载数据集并将其拆分为训练集和测试集。
我们将输出CIFAR-10中的训练样本形状、测试样本形状和课程总数。我们之前看到有10个班级。为了举例,我们将从训练集和测试集中输出两个示例图像。
输出:
找到输入图像的形状,然后将其重塑为用于训练和测试集的输入格式。之后,将所有数据类型更改为浮点数。
通过将训练数据和测试数据除以255来将数据归一化到0-1之间,然后使用to_catagorical()函数将所有标签转换为单热矢量。
使用单热编码显示类别标签的更改。
输出:
现在创建我们的模型,将加载Convo图层,然后合并图层。然后我们将连接密集(FC)层来预测类。输入到第一个Convo层的输入数据,该Convo层的输出用作下一个Convo层的输入,依此类推。最后,数据被送到FC层,试图预测正确的标签。
初始化所有参数并使用rmsprops优化器编译我们的模型。有许多优化器,例如adam、SGD、GradientDescent、Adagrad、Adadelta和Adamax,您可以随意尝试它。批量为256,有50个epoch。
model.summary()用于查看模型中每个图层中的所有参数和形状。您可以观察到总参数为276,138,总可训练参数为276,138。非训练参数为0。
输出:
在编译我们的模型之后,我们将通过fit()方法训练我们的模型,然后对其进行评估。
输出:
经过训练,我们得到了83.86%的准确率和75.48%的验证准确性。这个结果还是不错的。
结论:
恭喜! 您通过了解Keras的基本概念,在Keras中构建了卷积神经网络。 您可以通过更改其超参数来试验它!
编译出品