深度学习(10-11节)
卷积操作
计算机视觉的例子:
- 图片分类
- 目标检测
- 神经网络实现图片转化迁移
但因为图片的像素高时,每张图片都很是一个很大的维度,如何处理大量的高像素图片呢?这可能就要用到卷积神经网络了。
边缘检测示例
我们通过边缘检测的例子来看卷积操作是如何进行的。
在边缘检测的例子里,卷积核从左到右每列为{1, 1, 1},{0, 0, 0},{-1, -1, -1}。
如图所示,左边是一个6
对应编程的函数:
python:conv_forward
tensorflow:tf.nn.conv2d
PyTorch:torch.nn.Conv2d
再举个更加明显的例子,如下图:
可以看到很明显的就是,如果左边的图片没有变化,与卷积核进行卷积就会得到0,如果选取的区域图片有变化,那么得到的结果就有正值。上述的过程看一看成如下示意图:
将最左边的变化的部分在最右边得到的结果显现出来。
更多的边缘检测内容
在上节例子中的卷积核可以为我们检测由亮到暗的一个过渡的过程,如果是由暗到亮,那么输出的就是负值。
如果我们把上节检测垂直边缘的卷积核旋转一下,从第一行到第三行分别是{1, 1, 1},{0, 0, 0},{-1, -1, -1},这就变成了一个水平的边缘检测。
列举几个3
- Sobel滤波器:第一列到第三列分别为:{1, 2, 1},{0, 0, 0},{-1, -2, -1}。
- Scharr滤波器:第一列到第三列分别为:{3, 10, 3},{0, 0, 0},{-3, -10, -3}。
Padding
在进行卷积的过程中,会发现很容易将图像最边缘的部分给忽略掉。一般的做法是在进行卷积之前,会在周围再填充一层像素,这样m
填充一层就代表padding=1,填充两层代表padding=2…
- Valid卷积,其卷积过程如下:
- Same卷积,顾名思义就是卷积前后的大小是相同的,其卷积过程如下:
上述过程中所有填充的像素一般使用0来填充!
卷积步长
卷积步长指得是,卷积模板每次移动的距离,一般用英文stride表示。如果步长表示为
深度学习的卷积vs数学上的卷积
前面所讲的所有操作都属于深度学习上的卷积,其实这严格意义上来讲不是一种卷积。真正的在数学上的卷积先要对卷积核进行翻转操作,但在深度学习的文献中,我们将直接把深度学习上的伪卷积称为卷积。
三维卷积
我们知道彩色的图像像素矩阵是一个三维矩阵,其中第三个维度为3,代表RGB三个通道。那么如果图像是三维的(假设为6
为什么输出的图像是只有一个通道的呢?
可以看一下如下的图来理解:
将三个通道的卷积核看成一个长方体,在三通道图像矩阵上进行滑动得到输出。这样做的好处是可以对不同的通道进行不同的卷积模版设置,参数设置不同,可以得到不同的特征检测器。
为了对一个图像同时进行不同特征的选择,我们可以同时用不同的卷积核对图像做卷积,同时得到不同的输出(每个输出都是单通道的),我们将几个输出堆叠在一起,就形成了多维矩阵。注意有几个卷积核,得到图像输出的第三个维度就有几个。
单层卷积网络
学会了三维卷积之后,其实就可以使用三维卷积来表示单层卷积网络的结构了,下面用一个例子来表示过程:
same padding
,使输入输出前后的图像高度和宽度一致;使用
简单卷积网络示例
假设一张padding方式
都采用no padding
,卷积步长初始为1:
- 初始:
- 第一层卷积核:
- 第二层卷积核:
- 第三层卷积核:
然后将logistic层
或者softmax层
得到预测值。
池化层
- 举一个最大池化层的例子:
如上一个
最大池化只有一组超参数,并没有参数需要进行学习。超参数分别为
- 平均池化:
平均池化的原理和最大池化相同,只是将池化的方式变成了求平均值。
我们在阅读文献时,在计算神经网络使用的层数时,只计算具有参数的层数,只具有超参数的层不参与计算!
对于卷积神经网络的搭建,一般使用别人文章搭建好的超参数来修改,不要自己设置!
一般来说随着卷积神经网络的层数深入,
和 会越来越小, 会原来越大。
常见的卷积神经网络的结构:
conv-pool-conv-pool-FC-FC-FC-softmax
卷积神经网络示例探究
经典网络
- LeNet-5:识别手写数字的经典网络
LeNet-5
是针对灰度图片进行训练的。其网络结构如下:
当时早期一般使用平均池化,在现在的版本中,最后输出
- AlexNet
这是针对计算机视觉大赛做的模型,其网络结构如下:
其中图片矩阵的宽和高不变的地方都是因为使用padding填充使得图片的宽高不变。相比LeNet-5网络,该网络的参数大约有6000万个参数。
- VGG-16
网络结构如下:
*注意其中的卷积
残差网络
- 残差块
残差块是在一个深层的网络内,将前层与比较深的后层建立联系。上图以一个双线性层举例,从最上面的结构变成了下面的结构。
从公式上来说,线性层的公式为:
short cut
,如果这种连接跨越了很多层,你可能还能听到一个术语叫skip connection
,中文意思叫远跳连接。
我使用深度神经网络进行训练的时候会发现,随着网络深度的提升,训练的错误率会先下降后上升。而残差网络的出现,解决了这一问题,即使100层的网络也不会出现错误率提升的现象。这使得我们在训练深度网络的时候,解决了梯度消失和梯度爆炸的问题。
那么为什么残差网络的做法能够达到这样的效果呢?
如果
网络中的网络 & 卷积
对于单通道的图片,1
1
谷歌Inception网络介绍
GoogLeNet是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增大网络的深度(层数)来获得更好的训练效果,但层数的增加会带来很多负作用,比如overfit、梯度消失、梯度爆炸等。inception的提出则从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。
inception结构示例如下所示:
首先我们先来举个例子看一下,1
1的卷积网络可以打打降低成本。
假设一个padding=same
的变化,计算成本为
如果我们在中间加若干个
如果对inceotion中的每一个网络都做
这就是一个完整的inception模块。
迁移学习
我们如何使用别人训练好的权重参数运用到自己的网络中呢?
以ImageNet数据集的网络为例,因为它是一个1000分类的问题,如何运用到我们自己的4分类问题上呢?最好的办法就是将原有的softmax层去掉,设计自己的softmax层。还有就是训练的过程中,那些预先训练好的参数是不参与你后续的训练的:这有两种实现方式,第一种就是通过框架来调整参数,使得前面的参数不参与前向和后向传播;第二种方式就是将x输入,在训练好的参数的计算下,保存输出的结果,用于后续自己的训练。
但如果你的数据集是一个很小的数据集,该如何做呢?
那么我们可能需要只冻结预训练网络的前层网络,构建自己的输出单元,训练后层网络。或者你可以将后层的网络换成自己的网络。
那么如果你的数据集比较大,如何做呢?
我们不需要冻结任何的网络,直接将预训练好的网络当做初始化,修改输出单元,直接进行训练。
数据增强
数据增强的方式如下:
- 垂直镜像对称
- 随机裁剪
- 局部扭曲
- 色彩转化: 会使你的模型对颜色更具鲁棒性。
因为有部分公式可能因为博客插件不支持的原因,完整的笔记请看: https://github.com/caixiongjiang/deep-learning-computer-vision
最后修改于 2022-08-01

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。