0写在前面
这两天陆续看了一些关于卷积神经网络的视频和博文,把我觉得比较有用的知识和内容梳理一下,理顺逻辑,自己也可加深理解,写在这里,日后想看,随手就能翻来,永不会丢失。
1卷积神经网络
既然叫卷积神经网络,这里面首先是
卷积
,然后是
神经网
络
,是2者的一个结合,
卷积
这个概念实际上来自于信号处理领域,一般是对2个信号进行卷积运算,见下图:
神经网络
,这是机器学习的元老,是对人脑神经元工作机制的模拟,每个神经元是一个计算单元,输入的数据与权重进行相乘、求和,再加上偏置,得到的数据再经过激活函数,将结果进行输出,见下图,多个神经元相互连接组成神经网络,具体就不展开说了。
卷积神经网络在图像分类和识别领域的应用非常多,最早用于手写数字的分类识别,后来逐渐发展起来。
2图片格式
那就从手写体图像识别说起吧,一副图片如果是单色的,那么可以看成是一个二维的数字矩阵,每个像素点的颜色都可以用灰度值来表示;那如果图像是彩色的,可以将图像看成是RGB三个单色图片叠加的组合。
每一张图片的每一个像素点,其实都是一个数值,整体可看成一个三维矩阵。
3图片卷积运算
那么对一个彩色图像做卷积,到底做了什么呢?下面这张动图,很好地展示了图像卷积计算的过程,原始图像有RGB三个通道channel1-3,对应有3个
卷积核
Kernel1-3,每一个通道的图片与对应的卷积核做乘加运算,每个通道得到的数值再相加,加上总体的偏置Bias得到
特征图
(feature map)里面的一个值。
下面这个图是一个立体的展示。
4 kernel与feature map
这里面第一个问题,就是卷积核为什么是3*3大小的,实际上这个尺寸也是经过学者们不断研究总结出来的,目前认为3*3的
感受野
足够用,而且运算量也会相对低,还有1*1的卷积核在使用,其它的基本不用了。
第二个问题,卷积核里面的参数是怎么来的,其实这里面的参数机器学习要实现的,当我们把所有的核参数都调整好,那这个模型也就确定了。也有一些先验的卷积核,如下面的核,进行卷积之后,可以实现锐化和边缘提取的效果。
那我们对一幅图片进行卷积之后,就会形成一个
Feature map
,它会提取一些特征,用不同的核进行卷积就会输出多个Feature map,
卷积核/Kernels,(
convolution kernel
)也叫过滤器、滤波器。
特征图/Feature map,当图像像素值经过过滤器后得到的就是特征图。
下面2张图就很直观地展示了kernel和feature map的实际样子。
卷积神经网络处理过程中,随着模型运算的深入,图像的尺寸(h*w)会越来越小,但是提取的特征会越来越多。
5 padding/边缘填充
这里面由于边界的问题,每一次卷积之后,图像不可避免地会被压缩一点,这就涉及到一个概念
padding
,如果设置padding的值为“
same
”,则会在原图像周围补充1圈像素点,一般补0,这样后面的图像尺寸都会与原图像相同。默认参数是“
valid
”,翻译过来是
有效
的意思,这里的
有效
指的是与卷积核做运算的图片像素都是有效的,实际上就是没有外圈的补0。
unvalid
|
|
valid
|
|
下图展示的就是带padding的卷积效果,
这个图的问题是用的是4*4的卷积核
,实际中没有用4*4卷积核的。
用3*3的卷积核,可保持图像卷积后尺寸不变。
图片
引自:
https://github.com/vdumoulin/conv_arithmetic
6 Stride
/
步长
上图是步长为1的情况,如果步长为 2,就是相当每隔两行或者两列进行卷积,实际上起到了降维的作用,就是卷积后的feature map尺寸会变小。
图片
引自:
https://github.com/vdumoulin/conv_arithmetic
7 pooling/
池化
池化主要作用是把数据降维,也叫下采样,可以有效的避免过拟合。主要有两种池化方式,
Max
pooling
/
avg pooling,
通常情况下,池化区域是
2*2
大小,池化之后,4*4的图片,会变成2*2大小。
8 shape
在tensorflow和pytorch中,shape的结构有所区别
tensorflow输入shape为
(batch_size, height, weight,
in_channels
)
/
(样本数、图像高度、图像宽度,
图像通道数
)
pytorch输入shape为(batch_size,
in_channels,
height, weight)
上图中,
输入图片的shape: [inChannels,
height
,
weight
] /[3,8,8];
卷积核的shape: [outChannels, inChannels,
height
,
weight
]/[5,3,3,3];
输出图片的shape: [outChannels,
outHeight
, out
weight
]/[5,6,6];
卷积核的输入通道数(in depth)由
输入矩阵的通道数
(
inChannels
)所决定。比如:一个RGB格式的图片,其输入通道数为3。
输出矩阵的通道数(
out depth
)由
卷积核的输出通道数所决定
,比如下面这个动画当中,卷积核有8个,那么输出
outChannels则为8。
图片
引自:https://animatedai.github.io/
9 epoch、batch、Batch Size、step
epoch
:
表示将训练数据集中的所有样本都过一遍(且仅过一遍)的训练过程。在一个epoch中,训练算法会按照设定的顺序将所有样本输入模型进行前向传播、计算损失、反向传播和参数更新。一个epoch通常包含多个step。
batch
:
一般翻译为“
批次
”,表示一次性输入模型的一组样本。在神经网络的训练过程中,训练数据往往是很多的,比如几万条甚至几十万条——如果我们一次性将这上万条的数据全部放入模型,对计算机性能、神经网络模型学习能力等的要求太高了;那么就可以将训练数据划分为多个batch,并随后分批将每个batch的样本一起输入到模型中进行前向传播、损失计算、反向传播和参数更新。但要注意,一般batch这个词用的不多,多数情况大家都是只关注batch size的。
Batch Size
(批大小):
表示在单次训练中传递给模型的图像数量,
我们在神经网络训练过程中,往往需要将训练数据划分为多个
batch
;而具体每一个