mirror of
https://github.com/Estom/notes.git
synced 2026-04-05 03:48:56 +08:00
卷积神经网络和计算机视觉
This commit is contained in:
@@ -150,7 +150,7 @@ $$n^{[l]}_W = \biggl\lfloor \frac{n^{[l-1]}_W+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \bi
|
||||
|
||||
> 由于深度学习的相关文献并未对卷积标示法达成一致,因此不同的资料关于高度、宽度和通道数的顺序可能不同。有些作者会将通道数放在首位,需要根据标示自行分辨。
|
||||
|
||||
## 8 简单卷积网络示例
|
||||
## 8 简单卷积网络
|
||||
|
||||
* 一个简单的 CNN 模型如下图所示:
|
||||
|
||||
@@ -158,14 +158,18 @@ $$n^{[l]}_W = \biggl\lfloor \frac{n^{[l-1]}_W+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \bi
|
||||
|
||||
* 其中,$a^{[3]}$的维度为 7x7x40,将 1960 个特征平滑展开成 1960 个单元的一列,然后连接最后一级的输出层。输出层可以是一个神经元,即二元分类(logistic);也可以是多个神经元,即多元分类(softmax)。最后得到预测输出 $\hat y$。
|
||||
|
||||
* 随着神经网络计算深度不断加深,图片的高度和宽度 $n^{[l]}_H $、$n^{[l]}_W$一般逐渐减小,而 $n^{[l]}_c$在增加。
|
||||
* 随着神经网络计算深度不断加深,图片的高度和宽度 $n^{[l]}_H$、$n^{[l]}_W$一般逐渐减小,而 $n^{[l]}_c$在增加。
|
||||
|
||||
* 一个典型的卷积神经网络通常包含有三种层:**卷积层(Convolution layer)**、**池化层(Pooling layer)**、**全连接层(Fully Connected layer)**。仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络还是会添加池化层和全连接层,它们更容易设计。
|
||||
|
||||
## 9 池化层
|
||||
|
||||
### 池化层作用
|
||||
|
||||
* **池化层**的作用是缩减模型的大小,提高计算速度,同时减小噪声提高所提取特征的稳健性。
|
||||
|
||||
### 最大池化层
|
||||
|
||||
* 采用较多的一种池化过程叫做**最大池化(Max Pooling)**。将输入拆分成不同的区域,输出的每个元素都是对应区域中元素的最大值,如下图所示:
|
||||
|
||||

|
||||
@@ -174,27 +178,31 @@ $$n^{[l]}_W = \biggl\lfloor \frac{n^{[l-1]}_W+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \bi
|
||||
|
||||
* 对最大池化的一种直观解释是,元素值较大可能意味着池化过程之前的卷积过程提取到了某些特定的特征,池化过程中的最大化操作使得只要在一个区域内提取到某个特征,它都会保留在最大池化的输出中。但是,没有足够的证据证明这种直观解释的正确性,而最大池化被使用的主要原因是它在很多实验中的效果都很好。
|
||||
|
||||
|
||||
### 平均池化层
|
||||
* 另一种池化过程是**平均池化(Average Pooling)**,就是从取某个区域的最大值改为求这个区域的平均值:
|
||||
|
||||

|
||||
|
||||
池化过程的特点之一是,它有一组超参数,但是并**没有参数需要学习**。池化过程的超参数包括滤波器的大小 $f$、步长 $s$,以及选用最大池化还是平均池化。而填充 $p$则很少用到。
|
||||
### 池化层的特点
|
||||
|
||||
池化过程的输入维度为:
|
||||
* 池化过程的特点之一是,它有一组超参数,但是并**没有参数需要学习**。池化过程的超参数包括滤波器的大小 $f$、步长 $s$,以及选用最大池化还是平均池化。而填充 $p$则很少用到。
|
||||
|
||||
* 池化过程的输入维度为:
|
||||
|
||||
$$n_H \times n_W \times n_c$$
|
||||
|
||||
输出维度为:
|
||||
* 输出维度为:
|
||||
|
||||
$$\biggl\lfloor \frac{n_H-f}{s}+1 \biggr\rfloor \times \biggl\lfloor \frac{n_W-f}{s}+1 \biggr\rfloor \times n_c$$
|
||||
|
||||
## 卷积神经网络示例
|
||||
## 10 卷积神经网络示例
|
||||
|
||||

|
||||

|
||||
|
||||
在计算神经网络的层数时,通常只统计具有权重和参数的层,因此池化层通常和之前的卷积层共同计为一层。
|
||||
|
||||
图中的 FC3 和 FC4 为全连接层,与标准的神经网络结构一致。整个神经网络各层的尺寸与参数如下表所示:
|
||||
* 在计算神经网络的层数时,通常只统计具有权重和参数的层,因此池化层通常和之前的卷积层共同计为一层。
|
||||
* 全连接层是简单的矩阵乘法,应该说是现行变换。用来缩小数据的规模。
|
||||
* 图中的 FC3 和 FC4 为全连接层,与标准的神经网络结构一致。整个神经网络各层的尺寸与参数如下表所示:
|
||||
|
||||
| Activation shape | Activation Size | #parameters
|
||||
:-: | :-: | :-: | :-:
|
||||
@@ -207,15 +215,39 @@ $$\biggl\lfloor \frac{n_H-f}{s}+1 \biggr\rfloor \times \biggl\lfloor \frac{n_W
|
||||
**FC4** | (84, 1) | 84 | 10164
|
||||
**Softmax** | (10, 1) | 10 | 850
|
||||
|
||||
个人推荐[一个直观感受卷积神经网络的网站](http://scs.ryerson.ca/~aharley/vis/conv/)。
|
||||
> 个人推荐[一个直观感受卷积神经网络的网站](http://scs.ryerson.ca/~aharley/vis/conv/)。
|
||||
|
||||
## 使用卷积的原因
|
||||
## 11 使用卷积的原因
|
||||
|
||||
相比标准神经网络,对于大量的输入数据,卷积过程有效地减少了 CNN 的参数数量,原因有以下两点:
|
||||
* 相比标准神经网络,对于大量的输入数据,卷积过程有效地减少了 CNN 的参数数量,原因有以下两点:
|
||||
|
||||
* **参数共享(Parameter sharing)**:特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。即在卷积过程中,不管输入有多大,一个特征探测器(滤波器)就能对整个输入的某一特征进行探测。
|
||||
* **稀疏连接(Sparsity of connections)**:在每一层中,由于滤波器的尺寸限制,输入和输出之间的连接是稀疏的,每个输出值只取决于输入在局部的一小部分值。
|
||||
* **参数共享(Parameter sharing)**:特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。即在卷积过程中,不管输入有多大,一个特征探测器(滤波器)就能对整个输入的某一特征进行探测。
|
||||
* **稀疏连接(Sparsity of connections)**:在每一层中,由于滤波器的尺寸限制,输入和输出之间的连接是稀疏的,每个输出值只取决于输入在局部的一小部分值。
|
||||
|
||||
池化过程则在卷积后很好地聚合了特征,通过降维来减少运算量。
|
||||
* 池化过程则在卷积后很好地聚合了特征,通过降维来减少运算量。
|
||||
|
||||
由于 CNN 参数数量较小,所需的训练样本就相对较少,因此在一定程度上不容易发生过拟合现象。并且 CNN 比较擅长捕捉区域位置偏移。即进行物体检测时,不太受物体在图片中位置的影响,增加检测的准确性和系统的健壮性。
|
||||
* 由于 CNN 参数数量较小,所需的训练样本就相对较少,因此在一定程度上不容易发生过拟合现象。并且 CNN 比较擅长捕捉区域位置偏移。即进行物体检测时,不太受物体在图片中位置的影响,增加检测的准确性和系统的健壮性。
|
||||
|
||||
|
||||
## 12 神经网络补充说明
|
||||
|
||||
### 常见的激活函数
|
||||
|
||||
1. relu
|
||||
2. sigmod
|
||||
3. tanh
|
||||
4. softplus
|
||||
5. softMax
|
||||
|
||||
### 神经网络激活函数推荐
|
||||
|
||||
* 普通的神经网络,可以使用任意的
|
||||
* 卷积神经网络的卷积层,推荐使用relu
|
||||
* 循环神经网络,推荐使用tanh或者relu
|
||||
|
||||
### 神经网络分层
|
||||
|
||||
* 卷积层
|
||||
* 池化层
|
||||
* 全连接层
|
||||
* 激活函数层(softmax等激活函数)
|
||||
@@ -1,18 +1,18 @@
|
||||
<h1 align="center">深度卷积网络:实例探究</h1>
|
||||
# 卷积神经网络:实例探究
|
||||
|
||||
讲到的经典 CNN 模型包括:
|
||||
## 1 卷积网络说明
|
||||
> 讲到的经典 CNN 模型包括:
|
||||
> * LeNet-5
|
||||
> * AlexNet
|
||||
> * VGG
|
||||
> * ResNet(Residual Network,残差网络)
|
||||
> * Inception Neural Network。
|
||||
|
||||
* LeNet-5
|
||||
* AlexNet
|
||||
* VGG
|
||||
|
||||
此外还有 ResNet(Residual Network,残差网络),以及 Inception Neural Network。
|
||||
|
||||
## 经典卷积网络
|
||||
## 2 经典卷积网络
|
||||
|
||||
### LeNet-5
|
||||
|
||||

|
||||

|
||||
|
||||
特点:
|
||||
|
||||
@@ -21,22 +21,22 @@
|
||||
* 典型的 LeNet-5 结构包含卷积层(CONV layer),池化层(POOL layer)和全连接层(FC layer),排列顺序一般为 CONV layer->POOL layer->CONV layer->POOL layer->FC layer->FC layer->OUTPUT layer。一个或多个卷积层后面跟着一个池化层的模式至今仍十分常用。
|
||||
* 当 LeNet-5模型被提出时,其池化层使用的是平均池化,而且各层激活函数一般选用 Sigmoid 和 tanh。现在,我们可以根据需要,做出改进,使用最大池化并选用 ReLU 作为激活函数。
|
||||
|
||||
相关论文:[LeCun et.al., 1998. Gradient-based learning applied to document recognition](http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=726791&tag=1)。吴恩达老师建议精读第二段,泛读第三段。
|
||||
> 相关论文:[LeCun et.al., 1998. Gradient-based learning applied to document recognition](http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=726791&tag=1)。吴恩达老师建议精读第二段,泛读第三段。
|
||||
|
||||
### AlexNet
|
||||
|
||||

|
||||

|
||||
|
||||
特点:
|
||||
|
||||
* AlexNet 模型与 LeNet-5 模型类似,但是更复杂,包含约 6000 万个参数。另外,AlexNet 模型使用了 ReLU 函数。
|
||||
* 当用于训练图像和数据集时,AlexNet 能够处理非常相似的基本构造模块,这些模块往往包含大量的隐藏单元或数据。
|
||||
|
||||
相关论文:[Krizhevsky et al.,2012. ImageNet classification with deep convolutional neural networks](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)。这是一篇易于理解并且影响巨大的论文,计算机视觉群体自此开始重视深度学习。
|
||||
> 相关论文:[Krizhevsky et al.,2012. ImageNet classification with deep convolutional neural networks](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)。这是一篇易于理解并且影响巨大的论文,计算机视觉群体自此开始重视深度学习。
|
||||
|
||||
### VGG
|
||||
|
||||

|
||||

|
||||
|
||||
特点:
|
||||
|
||||
@@ -45,15 +45,15 @@
|
||||
* 结构不复杂且规整,在每一组卷积层进行滤波器翻倍操作。
|
||||
* VGG 需要训练的特征数量巨大,包含多达约 1.38 亿个参数。
|
||||
|
||||
相关论文:[Simonvan & Zisserman 2015. Very deep convolutional networks for large-scale image recognition](https://arxiv.org/pdf/1409.1556.pdf)。
|
||||
> 相关论文:[Simonvan & Zisserman 2015. Very deep convolutional networks for large-scale image recognition](https://arxiv.org/pdf/1409.1556.pdf)。
|
||||
|
||||
## 残差网络
|
||||
## 3 残差网络
|
||||
|
||||
因为存在梯度消失和梯度爆炸问题,网络越深,就越难以训练成功。**残差网络(Residual Networks,简称为 ResNets)**可以有效解决这个问题。
|
||||
* 因为存在梯度消失和梯度爆炸问题,网络越深,就越难以训练成功。**残差网络(Residual Networks,简称为 ResNets)**可以有效解决这个问题。
|
||||
|
||||

|
||||

|
||||
|
||||
上图的结构被称为**残差块(Residual block)**。通过**捷径(Short cut,或者称跳远连接,Skip connections)**可以将 $a^{[l]}$添加到第二个 ReLU 过程中,直接建立 $a^{[l]}$与 $a^{[l+2]}$之间的隔层联系。表达式如下:
|
||||
* 上图的结构被称为**残差块(Residual block)**。通过**捷径(Short cut,或者称跳远连接,Skip connections)**可以将 $a^{[l]}$添加到第二个 ReLU 过程中,直接建立 $a^{[l]}$与 $a^{[l+2]}$之间的隔层联系。表达式如下:
|
||||
|
||||
$$z^{[l+1]} = W^{[l+1]}a^{[l]} + b^{[l+1]}$$
|
||||
|
||||
@@ -63,137 +63,140 @@ $$z^{[l+2]} = W^{[l+2]}a^{[l+1]} + b^{[l+2]}$$
|
||||
|
||||
$$a^{[l+2]} = g(z^{[l+2]} + a^{[l]})$$
|
||||
|
||||
构建一个残差网络就是将许多残差块堆积在一起,形成一个深度网络。
|
||||
* 构建一个残差网络就是将许多残差块堆积在一起,形成一个深度网络。
|
||||
|
||||

|
||||

|
||||
|
||||
为了便于区分,在 ResNets 的论文[He et al., 2015. Deep residual networks for image recognition](https://arxiv.org/pdf/1512.03385.pdf)中,非残差网络被称为**普通网络(Plain Network)**。将它变为残差网络的方法是加上所有的跳远连接。
|
||||
* 为了便于区分,在 ResNets 的论文[He et al., 2015. Deep residual networks for image recognition](https://arxiv.org/pdf/1512.03385.pdf)中,非残差网络被称为**普通网络(Plain Network)**。将它变为残差网络的方法是加上所有的跳远连接。
|
||||
|
||||
在理论上,随着网络深度的增加,性能应该越来越好。但实际上,对于一个普通网络,随着神经网络层数增加,训练错误会先减少,然后开始增多。但残差网络的训练效果显示,即使网络再深,其在训练集上的表现也会越来越好。
|
||||
* 在理论上,随着网络深度的增加,性能应该越来越好。但实际上,对于一个普通网络,随着神经网络层数增加,训练错误会先减少,然后开始增多。但残差网络的训练效果显示,即使网络再深,其在训练集上的表现也会越来越好。
|
||||
|
||||

|
||||

|
||||
|
||||
残差网络有助于解决梯度消失和梯度爆炸问题,使得在训练更深的网络的同时,又能保证良好的性能。
|
||||
* 残差网络有助于解决梯度消失和梯度爆炸问题,使得在训练更深的网络的同时,又能保证良好的性能。
|
||||
|
||||
### 残差网络有效的原因
|
||||
## 4 残差网络有效的原因
|
||||
|
||||
假设有一个大型神经网络,其输入为 $X$,输出为 $a^{[l]}$。给这个神经网络额外增加两层,输出为 $a^{[l+2]}$。将这两层看作一个具有跳远连接的残差块。为了方便说明,假设整个网络中都选用 ReLU 作为激活函数,因此输出的所有激活值都大于等于 0。
|
||||
* 假设有一个大型神经网络,其输入为 $X$,输出为 $a^{[l]}$。给这个神经网络额外增加两层,输出为 $a^{[l+2]}$。将这两层看作一个具有跳远连接的残差块。为了方便说明,假设整个网络中都选用 ReLU 作为激活函数,因此输出的所有激活值都大于等于 0。
|
||||
|
||||

|
||||

|
||||
|
||||
则有:
|
||||
* 则有:
|
||||
|
||||
$$
|
||||
\begin{equation}
|
||||
\begin{split}
|
||||
\begin{aligned}
|
||||
|
||||
a^{[l+2]} &= g(z^{[l+2]}+a^{[l]})
|
||||
\\\ &= g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]})
|
||||
\end{split}
|
||||
\end{equation}
|
||||
\end{aligned}
|
||||
$$
|
||||
|
||||
当发生梯度消失时,$W^{[l+2]}\approx0$,$b^{[l+2]}\approx0$,则有:
|
||||
* 当发生梯度消失时,$W^{[l+2]}\approx0$,$b^{[l+2]}\approx0$,则有:
|
||||
|
||||
$$a^{[l+2]} = g(a^{[l]}) = ReLU(a^{[l]}) = a^{[l]}$$
|
||||
|
||||
因此,这两层额外的残差块不会降低网络性能。而如果没有发生梯度消失时,训练得到的非线性关系会使得表现效果进一步提高。
|
||||
* 因此,这两层额外的残差块不会降低网络性能。而如果没有发生梯度消失时,训练得到的非线性关系会使得表现效果进一步提高。
|
||||
|
||||
注意,如果 $a^{[l]}$与 $a^{[l+2]}$的维度不同,需要引入矩阵 $W\_s$与 $a^{[l]}$相乘,使得二者的维度相匹配。参数矩阵 $W\_s$既可以通过模型训练得到,也可以作为固定值,仅使 $a^{[l]}$截断或者补零。
|
||||
* 注意,如果 $a^{[l]}$与 $a^{[l+2]}$的维度不同,需要引入矩阵 $W_s$与 $a^{[l]}$相乘,使得二者的维度相匹配。参数矩阵 $W_s$既可以通过模型训练得到,也可以作为固定值,仅使 $a^{[l]}$截断或者补零。
|
||||
|
||||

|
||||

|
||||
|
||||
上图是论文提供的 CNN 中 ResNet 的一个典型结构。卷积层通常使用 Same 卷积以保持维度相同,而不同类型层之间的连接(例如卷积层和池化层),如果维度不同,则需要引入矩阵 $W\_s$。
|
||||
* 上图是论文提供的 CNN 中 ResNet 的一个典型结构。卷积层通常使用 Same 卷积以保持维度相同,而不同类型层之间的连接(例如卷积层和池化层),如果维度不同,则需要引入矩阵 $W_s$。
|
||||
|
||||
## 1x1 卷积
|
||||
## 5 1x1 卷积
|
||||
|
||||
1x1 卷积(1x1 convolution,或称为 Network in Network)指滤波器的尺寸为 1。当通道数为 1 时,1x1 卷积意味着卷积操作等同于乘积操作。
|
||||
* 1x1 卷积(1x1 convolution,或称为 Network in Network)指滤波器的尺寸为 1。当通道数为 1 时,1x1 卷积意味着卷积操作等同于乘积操作。
|
||||
|
||||

|
||||

|
||||
|
||||
而当通道数更多时,1x1 卷积的作用实际上类似全连接层的神经网络结构,从而降低(或升高,取决于滤波器组数)数据的维度。
|
||||
* 而当通道数更多时,1x1 卷积的作用实际上类似全连接层的神经网络结构,从而降低(或升高,取决于滤波器组数)数据的维度。
|
||||
|
||||
池化能压缩数据的高度($n\_H$)及宽度($n\_W$),而 1×1 卷积能压缩数据的通道数($n\_C$)。在如下图所示的例子中,用 32 个大小为 1×1×192 的滤波器进行卷积,就能使原先数据包含的 192 个通道压缩为 32 个。
|
||||
* 池化能压缩数据的高度($n_H$)及宽度($n_W$),而 1×1 卷积能压缩数据的通道数($n_C$)。在如下图所示的例子中,用 32 个大小为 1×1×192 的滤波器进行卷积,就能使原先数据包含的 192 个通道压缩为 32 个。
|
||||
|
||||

|
||||

|
||||
|
||||
虽然论文[Lin et al., 2013. Network in network](https://arxiv.org/pdf/1312.4400.pdf)中关于架构的详细内容并没有得到广泛应用,但是 1x1 卷积的理念十分有影响力,许多神经网络架构(包括 Inception 网络)都受到它的影响。
|
||||
* 虽然论文[Lin et al., 2013. Network in network](https://arxiv.org/pdf/1312.4400.pdf)中关于架构的详细内容并没有得到广泛应用,但是 1x1 卷积的理念十分有影响力,许多神经网络架构(包括 Inception 网络)都受到它的影响。
|
||||
|
||||
## Inception 网络
|
||||
## 6 Inception 网络
|
||||
### 注意:名词解释
|
||||
|
||||
在之前的卷积网络中,我们只能选择单一尺寸和类型的滤波器。而 **Inception 网络的作用**即是代替人工来确定卷积层中的滤波器尺寸与类型,或者确定是否需要创建卷积层或池化层。
|
||||
* 卷积核kernel==通道数channel==过滤器filter
|
||||
* 三者表示提供的卷积算子的个数,每个卷积算子,都会对上一层所有通道的数据进行运算生成二维的卷积结果。多个卷积算子,生成多个二维卷积结果,堆叠成本层的多个通道。
|
||||
|
||||

|
||||
### inception的原理
|
||||
|
||||
如图,Inception 网络选用不同尺寸的滤波器进行 Same 卷积,并将卷积和池化得到的输出组合拼接起来,最终让网络自己去学习需要的参数和采用的滤波器组合。
|
||||
* 在之前的卷积网络中,我们只能选择单一尺寸和类型的滤波器。而 **Inception 网络的作用**即是代替人工来确定卷积层中的滤波器尺寸与类型,或者确定是否需要创建卷积层或池化层。
|
||||
|
||||
相关论文:[Szegedy et al., 2014, Going Deeper with Convolutions](https://arxiv.org/pdf/1409.4842.pdf)
|
||||

|
||||
|
||||
* 如图,Inception 网络选用不同尺寸的滤波器进行 Same 卷积,并将卷积和池化得到的输出组合拼接起来,最终让网络自己去学习需要的参数和采用的滤波器组合。
|
||||
|
||||
* 相关论文:[Szegedy et al., 2014, Going Deeper with Convolutions](https://arxiv.org/pdf/1409.4842.pdf)
|
||||
|
||||
### 计算成本问题
|
||||
|
||||
在提升性能的同时,Inception 网络有着较大的计算成本。下图是一个例子:
|
||||
* 在提升性能的同时,Inception 网络有着较大的计算成本。下图是一个例子:
|
||||
|
||||

|
||||

|
||||
|
||||
图中有 32 个滤波器,每个滤波器的大小为 5x5x192。输出大小为 28x28x32,所以需要计算 28x28x32 个数字,对于每个数,都要执行 5x5x192 次乘法运算。加法运算次数与乘法运算次数近似相等。因此,可以看作这一层的计算量为 28x28x32x5x5x192 = 1.2亿。
|
||||
* 图中有 32 个滤波器,每个滤波器的大小为 5x5x192。输出大小为 28x28x32,所以需要计算 28x28x32 个数字,对于每个数,都要执行 5x5x192 次乘法运算。加法运算次数与乘法运算次数近似相等。因此,可以看作这一层的计算量为 28x28x32x5x5x192 = 1.2亿。
|
||||
|
||||
为了解决计算量大的问题,可以引入 1x1 卷积来减少其计算量。
|
||||
* 为了解决计算量大的问题,可以引入 1x1 卷积来减少其计算量。
|
||||
|
||||

|
||||

|
||||
|
||||
对于同一个例子,我们使用 1x1 卷积把输入数据从 192 个通道减少到 16 个通道,然后对这个较小层运行 5x5 卷积,得到最终输出。这个 1x1 的卷积层通常被称作**瓶颈层(Bottleneck layer)**。
|
||||
* 对于同一个例子,我们使用 1x1 卷积把输入数据从 192 个通道减少到 16 个通道,然后对这个较小层运行 5x5 卷积,得到最终输出。这个 1x1 的卷积层通常被称作**瓶颈层(Bottleneck layer)**。
|
||||
|
||||
改进后的计算量为 28x28x192x16 + 28x28x32x5x5x15 = 1.24 千万,减少了约 90%。
|
||||
* 改进后的计算量为 28x28x192x16 + 28x28x32x5x5x15 = 1.24 千万,减少了约 90%。
|
||||
|
||||
只要合理构建瓶颈层,就可以既显著缩小计算规模,又不会降低网络性能。
|
||||
* 只要合理构建瓶颈层,就可以既显著缩小计算规模,又不会降低网络性能。
|
||||
|
||||
### 完整的 Inception 网络
|
||||
|
||||

|
||||

|
||||
|
||||
上图是引入 1x1 卷积后的 Inception 模块。值得注意的是,为了将所有的输出组合起来,红色的池化层使用 Same 类型的填充(padding)来池化使得输出的宽高不变,通道数也不变。
|
||||
* 上图是引入 1x1 卷积后的 Inception 模块。值得注意的是,为了将所有的输出组合起来,红色的池化层使用 Same 类型的填充(padding)来池化使得输出的宽高不变,通道数也不变。
|
||||
|
||||
多个 Inception 模块组成一个完整的 Inception 网络(被称为 GoogLeNet,以向 LeNet 致敬),如下图所示:
|
||||
* 多个 Inception 模块组成一个完整的 Inception 网络(被称为 GoogLeNet,以向 LeNet 致敬),如下图所示:
|
||||
|
||||

|
||||

|
||||
|
||||
注意黑色椭圆圈出的隐藏层,这些分支都是 Softmax 的输出层,可以用来参与特征的计算及结果预测,起到调整并防止发生过拟合的效果。
|
||||
* 注意黑色椭圆圈出的隐藏层,这些分支都是 Softmax 的输出层,可以用来参与特征的计算及结果预测,起到调整并防止发生过拟合的效果。
|
||||
|
||||
经过研究者们的不断发展,Inception 模型的 V2、V3、V4 以及引入残差网络的版本被提出,这些变体都基于 Inception V1 版本的基础思想上。顺便一提,Inception 模型的名字来自电影《盗梦空间》。
|
||||
* 经过研究者们的不断发展,Inception 模型的 V2、V3、V4 以及引入残差网络的版本被提出,这些变体都基于 Inception V1 版本的基础思想上。顺便一提,Inception 模型的名字来自电影《盗梦空间》。
|
||||
|
||||
## 使用开源的实现方案
|
||||
## 7 使用开源的实现方案
|
||||
|
||||
很多神经网络复杂细致,并充斥着参数调节的细节问题,因而很难仅通过阅读论文来重现他人的成果。想要搭建一个同样的神经网络,查看开源的实现方案会快很多。
|
||||
* 很多神经网络复杂细致,并充斥着参数调节的细节问题,因而很难仅通过阅读论文来重现他人的成果。想要搭建一个同样的神经网络,查看开源的实现方案会快很多。
|
||||
|
||||
## 迁移学习
|
||||
## 8 迁移学习
|
||||
|
||||
在“搭建机器学习项目”课程中,[迁移学习](http://kyonhuang.top/Andrew-Ng-Deep-Learning-notes/#/Structuring_Machine_Learning_Projects/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88ML%EF%BC%89%E7%AD%96%E7%95%A5%EF%BC%882%EF%BC%89?id=%e8%bf%81%e7%a7%bb%e5%ad%a6%e4%b9%a0)已经被提到过。计算机视觉是一个经常用到迁移学习的领域。在搭建计算机视觉的应用时,相比于从头训练权重,下载别人已经训练好的网络结构的权重,用其做**预训练**,然后转换到自己感兴趣的任务上,有助于加速开发。
|
||||
* 在“搭建机器学习项目”课程中,[迁移学习](http://kyonhuang.top/Andrew-Ng-Deep-Learning-notes/#/Structuring_Machine_Learning_Projects/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88ML%EF%BC%89%E7%AD%96%E7%95%A5%EF%BC%882%EF%BC%89?id=%e8%bf%81%e7%a7%bb%e5%ad%a6%e4%b9%a0)已经被提到过。计算机视觉是一个经常用到迁移学习的领域。在搭建计算机视觉的应用时,相比于从头训练权重,下载别人已经训练好的网络结构的权重,用其做**预训练**,然后转换到自己感兴趣的任务上,有助于加速开发。
|
||||
|
||||
对于已训练好的卷积神经网络,可以将所有层都看作是**冻结的**,只需要训练与你的 Softmax 层有关的参数即可。大多数深度学习框架都允许用户指定是否训练特定层的权重。
|
||||
* 对于已训练好的卷积神经网络,可以将所有层都看作是**冻结的**,只需要训练与你的 Softmax 层有关的参数即可。大多数深度学习框架都允许用户指定是否训练特定层的权重。
|
||||
|
||||
而冻结的层由于不需要改变和训练,可以看作一个固定函数。可以将这个固定函数存入硬盘,以便后续使用,而不必每次再使用训练集进行训练了。
|
||||
* 而冻结的层由于不需要改变和训练,可以看作一个固定函数。可以将这个固定函数存入硬盘,以便后续使用,而不必每次再使用训练集进行训练了。
|
||||
|
||||
上述的做法适用于你只有一个较小的数据集。如果你有一个更大的数据集,应该冻结更少的层,然后训练后面的层。越多的数据意味着冻结越少的层,训练更多的层。如果有一个极大的数据集,你可以将开源的网络和它的权重整个当作初始化(代替随机初始化),然后训练整个网络。
|
||||
* 上述的做法适用于你只有一个较小的数据集。如果你有一个更大的数据集,应该冻结更少的层,然后训练后面的层。越多的数据意味着冻结越少的层,训练更多的层。如果有一个极大的数据集,你可以将开源的网络和它的权重整个当作初始化(代替随机初始化),然后训练整个网络。
|
||||
|
||||
## 数据扩增
|
||||
## 9 数据扩增
|
||||
|
||||
计算机视觉领域的应用都需要大量的数据。当数据不够时,**数据扩增(Data Augmentation)**就有帮助。常用的数据扩增包括镜像翻转、随机裁剪、色彩转换。
|
||||
* 计算机视觉领域的应用都需要大量的数据。当数据不够时,**数据扩增(Data Augmentation)**就有帮助。常用的数据扩增包括镜像翻转、随机裁剪、色彩转换。
|
||||
|
||||
其中,色彩转换是对图片的 RGB 通道数值进行随意增加或者减少,改变图片色调。另外,**PCA 颜色增强**指更有针对性地对图片的 RGB 通道进行主成分分析(Principles Components Analysis,PCA),对主要的通道颜色进行增加或减少,可以采用高斯扰动做法来增加有效的样本数量。具体的 PCA 颜色增强做法可以查阅 AlexNet 的相关论文或者开源代码。
|
||||
* 其中,色彩转换是对图片的 RGB 通道数值进行随意增加或者减少,改变图片色调。另外,**PCA 颜色增强**指更有针对性地对图片的 RGB 通道进行主成分分析(Principles Components Analysis,PCA),对主要的通道颜色进行增加或减少,可以采用高斯扰动做法来增加有效的样本数量。具体的 PCA 颜色增强做法可以查阅 AlexNet 的相关论文或者开源代码。
|
||||
|
||||
在构建大型神经网络的时候,数据扩增和模型训练可以由两个或多个不同的线程并行来实现。
|
||||
* 在构建大型神经网络的时候,数据扩增和模型训练可以由两个或多个不同的线程并行来实现。
|
||||
|
||||
## 计算机视觉现状
|
||||
## 10 计算机视觉现状
|
||||
|
||||
通常,学习算法有两种知识来源:
|
||||
* 通常,学习算法有两种知识来源:
|
||||
* 被标记的数据
|
||||
* 手工工程
|
||||
|
||||
* 被标记的数据
|
||||
* 手工工程
|
||||
* **手工工程(Hand-engineering,又称 hacks)**指精心设计的特性、网络体系结构或是系统的其他组件。手工工程是一项非常重要也比较困难的工作。在数据量不多的情况下,手工工程是获得良好表现的最佳方式。正因为数据量不能满足需要,历史上计算机视觉领域更多地依赖于手工工程。近几年数据量急剧增加,因此手工工程量大幅减少。
|
||||
|
||||
**手工工程(Hand-engineering,又称 hacks)**指精心设计的特性、网络体系结构或是系统的其他组件。手工工程是一项非常重要也比较困难的工作。在数据量不多的情况下,手工工程是获得良好表现的最佳方式。正因为数据量不能满足需要,历史上计算机视觉领域更多地依赖于手工工程。近几年数据量急剧增加,因此手工工程量大幅减少。
|
||||
* 另外,在模型研究或者竞赛方面,有一些方法能够有助于提升神经网络模型的性能:
|
||||
* 集成(Ensembling):独立地训练几个神经网络,并平均输出它们的输出
|
||||
* Multi-crop at test time:将数据扩增应用到测试集,对结果进行平均
|
||||
|
||||
另外,在模型研究或者竞赛方面,有一些方法能够有助于提升神经网络模型的性能:
|
||||
|
||||
* 集成(Ensembling):独立地训练几个神经网络,并平均输出它们的输出
|
||||
* Multi-crop at test time:将数据扩增应用到测试集,对结果进行平均
|
||||
|
||||
但是由于这些方法计算和内存成本较大,一般不适用于构建实际的生产项目。
|
||||
* 但是由于这些方法计算和内存成本较大,一般不适用于构建实际的生产项目。
|
||||
@@ -1,41 +1,46 @@
|
||||
<h1 align="center">目标检测</h1>
|
||||
# 目标检测
|
||||
|
||||
目标检测是计算机视觉领域中一个新兴的应用方向,其任务是对输入图像进行分类的同时,检测图像中是否包含某些目标,并对他们准确定位并标识。
|
||||
> 目标检测是计算机视觉领域中一个新兴的应用方向,其任务是对输入图像进行分类的同时,检测图像中是否包含某些目标,并对他们准确定位并标识。
|
||||
|
||||
## 目标定位
|
||||
## 1 目标定位
|
||||
|
||||
定位分类问题不仅要求判断出图片中物体的种类,还要在图片中标记出它的具体位置,用**边框(Bounding Box,或者称包围盒)**把物体圈起来。一般来说,定位分类问题通常只有一个较大的对象位于图片中间位置;而在目标检测问题中,图片可以含有多个对象,甚至单张图片中会有多个不同分类的对象。
|
||||
* 定位分类问题不仅要求判断出图片中物体的种类,还要在图片中标记出它的具体位置,用**边框(Bounding Box,或者称包围盒)**把物体圈起来。一般来说,定位分类问题通常只有一个较大的对象位于图片中间位置;而在目标检测问题中,图片可以含有多个对象,甚至单张图片中会有多个不同分类的对象。
|
||||
|
||||
为了定位图片中汽车的位置,可以让神经网络多输出 4 个数字,标记为 $b\_x$、$b\_y$、$b\_h$、$b\_w$。将图片左上角标记为 (0, 0),右下角标记为 (1, 1),则有:
|
||||
* 为了定位图片中汽车的位置,可以让神经网络多输出 4 个数字,标记为 $b_x$、$b_y$、$b_h$、$b_w$。将图片左上角标记为 (0, 0),右下角标记为 (1, 1),则有:
|
||||
|
||||
* 红色方框的中心点:($b\_x$,$b\_y$)
|
||||
* 边界框的高度:$b\_h$
|
||||
* 边界框的宽度:$b\_w$
|
||||
* 红色方框的中心点:($b_x$,$b_y$)
|
||||
* 边界框的高度:$b_h$
|
||||
* 边界框的宽度:$b_w$
|
||||
|
||||
因此,训练集不仅包含对象分类标签,还包含表示边界框的四个数字。定义目标标签 Y 如下:
|
||||
* 因此,训练集不仅包含对象分类标签,还包含表示边界框的四个数字。定义目标标签 Y 如下:
|
||||
|
||||
$$\left[\begin{matrix}P\_c\\\ b\_x\\\ b\_y\\\ b\_h\\\ b\_w\\\ c\_1\\\ c\_2\\\ c\_3\end{matrix}\right]$$
|
||||
|
||||
则有:
|
||||
|
||||
$$P\_c=1, Y = \left[\begin{matrix}1\\\ b\_x\\\ b\_y\\\ b\_h\\\ b\_w\\\ c\_1\\\ c\_2\\\ c\_3\end{matrix}\right]
|
||||
$$
|
||||
\left[\begin{matrix}P_c\\\ b_x\\\ b_y\\\ b_h\\\ b_w\\\ c_1\\\ c_2\\\ c_3\end{matrix}\right]
|
||||
$$
|
||||
|
||||
其中,$c\_n$表示存在第 $n$个种类的概率;如果 $P\_c=0$,表示没有检测到目标,则输出标签后面的 7 个参数都是无效的,可以忽略(用 ? 来表示)。
|
||||
* 则有:
|
||||
|
||||
$$P\_c=0, Y = \left[\begin{matrix}0\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\end{matrix}\right]$$
|
||||
$$
|
||||
P_c=1, Y = \left[\begin{matrix}1\\\ b_x\\\ b_y\\\ b_h\\\ b_w\\\ c_1\\\ c_2\\\ c_3\end{matrix}\right]
|
||||
$$
|
||||
|
||||
损失函数可以表示为 $L(\hat y, y)$,如果使用平方误差形式,对于不同的 $P\_c$有不同的损失函数(注意下标 $i$指标签的第 $i$个值):
|
||||
* 其中,$c_n$表示存在第 $n$个种类的概率;如果 $P_c=0$,表示没有检测到目标,则输出标签后面的 7 个参数都是无效的,可以忽略(用 ? 来表示)。
|
||||
|
||||
1. $P\_c=1$,即$y\_1=1$:
|
||||
$$
|
||||
P_c=0, Y = \left[\begin{matrix}0\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\end{matrix}\right]
|
||||
$$
|
||||
|
||||
$L(\hat y,y)=(\hat y\_1-y\_1)^2+(\hat y\_2-y\_2)^2+\cdots+(\hat y\_8-y\_8)^2$
|
||||
* 损失函数可以表示为 $L(\hat y, y)$,如果使用平方误差形式,对于不同的 $P_c$有不同的损失函数(注意下标 $i$指标签的第 $i$个值):
|
||||
|
||||
2. $P\_c=0$,即$y\_1=0$:
|
||||
1. $P_c=1$,即$y_1=1$:
|
||||
|
||||
$L(\hat y,y)=(\hat y\_1-y\_1)^2$
|
||||
$L(\hat y,y)=(\hat y_1-y_1)^2+(\hat y_2-y_2)^2+\cdots+(\hat y_8-y_8)^2$
|
||||
|
||||
除了使用平方误差,也可以使用逻辑回归损失函数,类标签 $c\_1,c\_2,c\_3$ 也可以通过 softmax 输出。相比较而言,平方误差已经能够取得比较好的效果。
|
||||
2. $P_c=0$,即$y_1=0$:
|
||||
|
||||
$L(\hat y,y)=(\hat y_1-y_1)^2$
|
||||
|
||||
* 除了使用平方误差,也可以使用逻辑回归损失函数,类标签 $c_1,c_2,c_3$ 也可以通过 softmax 输出。相比较而言,平方误差已经能够取得比较好的效果。
|
||||
|
||||
## 特征点检测
|
||||
|
||||
@@ -76,7 +81,7 @@ $$P\_c=0, Y = \left[\begin{matrix}0\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\end{matri
|
||||
|
||||
**YOLO(You Only Look Once)算法**可以用于得到更精确的边框。YOLO 算法将原始图片划分为 n×n 网格,并将[目标定位](http://kyonhuang.top/Andrew-Ng-Deep-Learning-notes/#/Convolutional_Neural_Networks/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B?id=%e7%9b%ae%e6%a0%87%e5%ae%9a%e4%bd%8d)一节中提到的图像分类和目标定位算法,逐一应用在每个网格中,每个网格都有标签如:
|
||||
|
||||
$$\left[\begin{matrix}P\_c\\\ b\_x\\\ b\_y\\\ b\_h\\\ b\_w\\\ c\_1\\\ c\_2\\\ c\_3\end{matrix}\right]$$
|
||||
$$\left[\begin{matrix}P_c\\\ b_x\\\ b_y\\\ b_h\\\ b_w\\\ c_1\\\ c_2\\\ c_3\end{matrix}\right]$$
|
||||
|
||||
若某个目标的中点落在某个网格,则该网格负责检测该对象。
|
||||
|
||||
@@ -89,7 +94,7 @@ YOLO 算法的优点:
|
||||
1. 和图像分类和目标定位算法类似,显式输出边框坐标和大小,不会受到滑窗分类器的步长大小限制。
|
||||
2. 仍然只进行一次 CNN 正向计算,效率很高,甚至可以达到实时识别。
|
||||
|
||||
如何编码边框 $b\_x$、$b\_y$、$b\_h$、$b\_w$?YOLO 算法设 $b\_x$、$b\_y$、$b\_h$、$b\_w$ 的值是相对于网格长的比例。则 $b\_x$、$b\_y$ 在 0 到 1 之间,而 $b\_h$、$b\_w$ 可以大于 1。当然,也有其他参数化的形式,且效果可能更好。这里只是给出一个通用的表示方法。
|
||||
如何编码边框 $b_x$、$b_y$、$b_h$、$b_w$?YOLO 算法设 $b_x$、$b_y$、$b_h$、$b_w$ 的值是相对于网格长的比例。则 $b_x$、$b_y$ 在 0 到 1 之间,而 $b_h$、$b_w$ 可以大于 1。当然,也有其他参数化的形式,且效果可能更好。这里只是给出一个通用的表示方法。
|
||||
|
||||
相关论文:[Redmon et al., 2015. You Only Look Once: Unified, Real-Time Object Detection](https://arxiv.org/pdf/1506.02640.pdf)。Ng 认为该论文较难理解。
|
||||
|
||||
@@ -107,8 +112,8 @@ YOLO 算法中,可能有很多网格检测到同一目标。**非极大值抑
|
||||
|
||||
进行非极大值抑制的步骤如下:
|
||||
|
||||
1. 将包含目标中心坐标的可信度 $P\_c$ 小于阈值(例如 0.6)的网格丢弃;
|
||||
2. 选取拥有最大 $P\_c$ 的网格;
|
||||
1. 将包含目标中心坐标的可信度 $P_c$ 小于阈值(例如 0.6)的网格丢弃;
|
||||
2. 选取拥有最大 $P_c$ 的网格;
|
||||
3. 分别计算该网格和其他所有网格的 IoU,将 IoU 超过预设阈值的网格丢弃;
|
||||
4. 重复第 2~3 步,直到不存在未处理的网格。
|
||||
|
||||
@@ -120,7 +125,7 @@ YOLO 算法中,可能有很多网格检测到同一目标。**非极大值抑
|
||||
|
||||

|
||||
|
||||
在上图示例中,我们希望同时检测人和汽车。因此,每个网格的的标签中含有两个 Anchor Box。输出的标签结果大小从 3×3×8 变为 3×3×16。若两个 $P\_c$ 都大于预设阈值,则说明检测到了两个目标。
|
||||
在上图示例中,我们希望同时检测人和汽车。因此,每个网格的的标签中含有两个 Anchor Box。输出的标签结果大小从 3×3×8 变为 3×3×16。若两个 $P_c$ 都大于预设阈值,则说明检测到了两个目标。
|
||||
|
||||
在单目标检测中,图像中的目标被分配给了包含该目标中点的那个网格;引入 Anchor Box 进行多目标检测时,图像中的目标则被分配到了包含该目标中点的那个网格以及具有最高 IoU 值的该网格的 Anchor Box。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<h1 align="center">超参数调试、Batch 正则化和程序框架</h1>
|
||||
# 超参数调试、Batch 正则化和程序框架
|
||||
|
||||
## 超参数调试处理
|
||||
|
||||
@@ -103,23 +103,33 @@ Batch Normalization 效果很好的原因有以下两点:
|
||||
|
||||
## Softmax 回归
|
||||
|
||||
### 作用
|
||||
* 目前为止,介绍的分类例子都是二分类问题:神经网络输出层只有一个神经元,表示预测输出 $\hat y$是正类的概率 P(y = 1|x),$\hat y$ > 0.5 则判断为正类,反之判断为负类。
|
||||
|
||||
* 对于**多分类问题**,用 C 表示种类个数,则神经网络输出层,也就是第 L 层的单元数量 $n^{[L]} = C$。每个神经元的输出依次对应属于该类的概率,即 $P(y = c|x), c = 0, 1, .., C-1$。有一种 Logistic 回归的一般形式,叫做 **Softmax 回归**,可以处理多分类问题。
|
||||
|
||||
* 对于 Softmax 回归模型的输出层,即第 L 层,有:
|
||||
* 对于普通的神经网络激活函数,本层神经元的激活函数的输入值,只与上层神经元有关,但是在softmax激活函数中,输入值与本层的其他神经元的输入值Z也有关。非常特殊,这个关系体现在临时变量t当中。
|
||||
|
||||
|
||||
### 步骤
|
||||
1. Softmax层,首先计算权重值。
|
||||
|
||||
$$Z^{[L]} = W^{[L]}a^{[L-1]} + b^{[L]}$$
|
||||
|
||||
* for i in range(L),有:
|
||||
2. 计算一个临时变量
|
||||
|
||||
$$
|
||||
t = \sum_{i-1}^C e^{Z_i^{[L]}}
|
||||
$$
|
||||
|
||||
3. softmax层,计算概率输出
|
||||
$$a^{[L]}_i = \frac{e^{Z^{[L]}_i}}{\sum^C_{i=1}e^{Z^{[L]}_i}}$$
|
||||
|
||||
* 为输出层每个神经元的输出,对应属于该类的概率,满足:
|
||||
4. 输出层每个神经元的输出,对应属于该类的概率,满足:
|
||||
|
||||
$$\sum^C_{i=1}a^{[L]}_i = 1$$
|
||||
|
||||
* 一个直观的计算例子如下:
|
||||
5. 一个直观的计算例子如下:
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
机器学习(ML)策略(1)
|
||||
# 机器学习(ML)策略(1)
|
||||
|
||||
> 对于一个已经被构建好且产生初步结果的机器学习系统,为了能使结果更令人满意,往往还要进行大量的改进。鉴于之前的课程介绍了多种改进的方法,例如收集更多数据、调试超参数、调整神经网络的大小或结构、采用不同的优化算法、进行正则化等等,我们有可能浪费大量时间在一条错误的改进路线上。想要找准改进的方向,使一个机器学习系统更快更有效地工作,就需要学习一些在构建机器学习系统时常用到的策略。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
机器学习(ML)策略(2)
|
||||
# 机器学习(ML)策略(2)
|
||||
|
||||
## 错误分析
|
||||
|
||||
|
||||
Reference in New Issue
Block a user