假设读者了解神经网络的概念。
在机器学习方面,人工神经网络表现非常出色。人工神经网络用于各种分类任务,如图像、音频、单词。不同类型的神经网络用于不同的目的,例如我们使用循环神经网络更准确地使用 LSTM 来预测单词序列,类似地,我们使用卷积神经网络进行图像分类。在本博客中,我们将为 CNN 构建基本构建块。
在深入研究卷积神经网络之前,让我们先回顾一下神经网络的一些概念。在常规神经网络中,存在三种类型的层:
- 输入层:这是我们向模型提供输入的层。该层中的神经元数量等于我们数据中的特征总数(图像中的像素数)。
- 隐藏层:来自输入层的输入然后被送入隐藏层。根据我们的模型和数据大小,可以有许多隐藏层。每个隐藏层可以有不同数量的神经元,通常大于特征的数量。每层的输出是通过前一层的输出与该层的可学习权重的矩阵乘法计算的,然后加上可学习的偏差,然后是激活函数,这使得网络非线性。
- 输出层:然后将隐藏层的输出输入到逻辑函数,如 sigmoid 或 softmax,它将每个类的输出转换为每个类的概率分数。
然后将数据输入模型并获得每一层的输出这一步称为前馈,然后我们使用误差函数计算误差,一些常见的误差函数是交叉熵、平方损失误差等。之后,我们反向传播到通过计算导数来建立模型。这一步称为反向传播,主要用于最小化损失。
这是具有随机输入和两个隐藏层的神经网络的基本Python代码。
Python
activation = lambda x: 1.0/(1.0 + np.exp(-x)) # sigmoid function
input = np.random.randn(3, 1)
hidden_1 = activation(np.dot(W1, input) + b1)
hidden_2 = activation(np.dot(W2, hidden_1) + b2)
output = np.dot(W3, hidden_2) + b3
W1,W2,W3,b1,b2,b3是模型的可学习参数。
卷积神经网络
卷积神经网络或 covnet 是共享参数的神经网络。想象一下你有一个图像。它可以表示为具有长、宽(图像的尺寸)和高度(因为图像通常具有红色、绿色和蓝色通道)的长方体。
现在想象一下这个图像的一小块,并在上面运行一个小的神经网络,比如说,k 个输出并垂直表示它们。现在在整个图像上滑动该神经网络,结果,我们将获得另一张具有不同宽度、高度和深度的图像。现在我们有更多的通道而不是只有 R、G 和 B 通道,但宽度和高度更小。此操作称为卷积。如果补丁大小与图像的大小相同,它将是一个常规的神经网络。由于这个小补丁,我们的权重更少。
现在让我们谈谈整个卷积过程中涉及的一些数学。
- 卷积层由一组可学习的过滤器(上图中的补丁)组成。每个过滤器的宽度和高度都很小,并且与输入体积的深度相同(如果输入层是图像输入,则为 3)。
- 例如,如果我们必须在尺寸为 34x34x3 的图像上运行卷积。过滤器的可能大小可以是 axax3,其中 ‘a’ 可以是 3、5、7 等,但与图像尺寸相比较小。
- 在前向传递期间,我们一步一步地在整个输入体积上滑动每个过滤器,其中每个步骤称为步幅(对于高维图像,其值可以为 2 或 3 甚至 4),并计算过滤器和补丁权重之间的点积从输入量。
- 当我们滑动过滤器时,我们将获得每个过滤器的二维输出,我们将它们堆叠在一起,结果,我们将获得深度等于过滤器数量的输出体积。网络将学习所有过滤器。
用于构建 ConvNet 的层
covnets 是一系列层,每一层通过可微函数将一个体积转换为另一个体积。
图层类型:
让我们举个例子,在尺寸为 32 x 32 x 3 的图像上运行 covnets。
- 输入层:该层保存图像的原始输入,宽度为 32,高度为 32,深度为 3。
- 卷积层:该层通过计算所有过滤器和图像块之间的点积来计算输出。假设我们对这一层总共使用 12 个过滤器,我们将获得尺寸为 32 x 32 x 12 的输出体积。
- 激活函数层:该层将逐元素激活函数应用于卷积层的输出。一些常见的激活函数是 RELU:max(0, x)、Sigmoid:1/(1+e^-x)、Tanh、Leaky RELU 等。 体积保持不变,因此输出体积的尺寸为 32 x 32 x 12。
- 池层:该层周期性地插入到 covnets 中,其主要函数是减少体积的大小,使计算快速减少内存并防止过度拟合。两种常见的池化层类型是最大池化和平均池化。如果我们使用具有 2 x 2 过滤器和步长 2 的最大池,则最终体积的尺寸将为 16x16x12。
- 全连接层:该层是常规神经网络层,它从前一层获取输入并计算类分数并输出大小等于类数的一维数组。