目录
一、Fully Connected Network
【全连接层处理图像】
【全连接层存在的问题?】
【改进/解决方法】
【CNN与FNN】
二、CNN
【CNN结构】
【CNN各层概述】
三、CNN层详述
【卷积层Convolution】
【输入与输出】
【卷积核】
【卷积层尺寸的计算原理】
【卷积计算】
【多输入通道卷积计算】
【多输出通道卷积计算】
【批处理卷积计算】
【卷积效果实例】
【池化层Pooling】
【参数】
【池化计算】
【池化效果】
相邻层的所有神经元之间都有连接,这称为全连接(fully-connected)。
将图像用矩阵[H*W*RGB channel]来表示。全连接层需要把三维矩阵flatten为一维数据,作为一个拉直的向量,输入到神经网络里,这相当于把图像的每一个像素点都作为输入。
但是没有必要将每个像素点都输入。正如人类不会仔细到逐像素点地看图片。一般会关注图片的某些特征、区域,而忽略其他。而且全连接层会忽视形状,将全部的输入数据作为相同的神经元(同一维度的神经元)处理,所以无法利用与形状相关的信息。
添加特殊层做简化,可以提取图像的特征输入到神经网络,而不是将每个像素点整张图像都输入。
【引入CNN:添加卷积层 Convolution 和池化层 Pooling】
在CNN中,层的连接顺序是 :Convolution - ReLU - Pooling. Pooling有时被省略。
卷积层的神经元只与前一层的部分神经元节点相连,即它的神经元间的连接是非全连接的,且同一层中某些神经元之间的连接的权重 w 和偏移 b 是共享的(即相同的),这样大量地减少了需要训练参数的数量。
CNN由输入和输出层以及多个隐藏层组成,隐藏层可分为卷积层、池化层、RELU层和全连通层,如下图:
输入层:CNN的输入为原始图像,三维(RGB)或二维的向量。
卷积层:CNN的核心,卷积层由一组可学习的滤波器/卷积核(filter/kernel)[带着固定权重的神经元]组成,它们具有小的感受野,每个卷积核具有kernel size,padding,stride等参数。从图像的左上角依次做内积操作,提取出图片的高层次特征。卷积层的输入输出数据称为特征图 Feature Map。
池化层:对卷积后输出的Feature Map进行下采样操作,保留原特征的同时减少神经网络训练的参数,防止过拟合。
激活层:在CNN中使用ReLu激活函数,在网络中引入了非线性。通过ReLu激活函数传递卷积运算的结果。因此,最终特征映射中的值不是简单的线性关系。
全连接层:全连接层的输入是一维向量,需要将Pooling 层的输出向量flatten成一个一维的向量,然后输入到全连接层中,最后送到Soft Max层进行类别的分类。
输出层:用于输出结果
卷积层由一组可学习的滤波器/卷积核(filter/kernel)组成,它们具有小的感受野,每个卷积核具有Kernel size,Padding,Stride等参数。
输入矩阵格式:四个维度:样本数、图像通道数、图像高度、图像宽度
输出矩阵格式:与输出矩阵的维度顺序和含义相同,但是后三个维度(图像通道数、图像高度、图像宽度)尺寸发生变化
卷积核是带着固定权重的神经元。可以看作是权重矩阵,矩阵里元素的值就是需要通过学习得到的参数。
卷积核(权重矩阵)格式:四个维度:输出通道数(卷积核的个数)、输入通道数、卷积核高度、卷积核宽度 Eg:kernel_size=3表示卷积核是一个3*3矩阵。
卷积核的输入通道数(in_channels)由输入矩阵的通道数所决定。(红色标注)
卷积核的输出通道数(out_channels)决定输出矩阵的通道数。(绿色标注)
输出矩阵的高度和宽度这两个维度的尺寸由输入矩阵、卷积核、扫描方式共同决定。(蓝色标注)计算公式如下:
卷积层就是在做卷积计算。
从图像的左上角开始,将各个位置上滤波器(卷积核:带着固定权重的神经元)的元素和输入的对应元素进行乘积累加运算,输出到对应位置,提取出图片的高层次特征。卷积层的输入输出数据称为特征图 Feature Map。
如图,输入数据大小是 (5,5),滤波器大小是 (3,3),Stride=1,输出大小是 (3,3)。
【Padding】
在进行卷积层运算前,有时会使用padding填充,向输入数据的周围填入固定的数据(比如0等)。Padding的目的/作用是调整输出的大小。
【Stride】
应用滤波器的位置间隔称为Stride步幅。之前的例子中步幅都是1,如果将步幅设为2,则如图所示,应用滤波器的窗口的间隔变为2个元素。增大步幅后,输出表小;增大填充后,步幅变化。
Padding、Stride的作用 动画呈现:
conv_arithmetic/README.md at master · vdumoulin/conv_arithmetic (github.com)
多个卷积核就是多个特征提取器。
在卷积神经网络的计算中,通常将多个样本放在一起形成一个mini-batch进行批量操作。卷积运算进行批处理时,需要将在各层间传递的数据保存为4维数据。按(batch_size, channels, height, width)的顺序保存数据。数据作为4维的形状在各层间传递。这里需要注意的是,网络间传递的是4维数据,对这N个数据进行了卷积运算。也就是说,批处理将N次的处理汇总成了1次进行。
左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。
当输入经过卷积层时,若感受视野比较小,步长Stride比较小,得到的Feature map (特征图)还是比较大,可以通过池化层来对每一个 Feature map进行降维操作,输出的深度还是不变的,依然为 Feature map 的个数。
Kernel_size:池化核大小,设置取最大值的窗口,类似于卷积层的卷积核。
Stride:步径,与卷积层不同,默认值是Kernel_size的大小。
padding:和卷积层一样,用法类似于Kernel_size。
Ceil_mode:在按照Stride移动进行匹配数据时,数据没有凑足kernel_size的大小,便涉及取舍问题,ceil_mode为True,则保留,若为False,则不保留。
池化层也有一个池化核(filter)来对Feature map矩阵进行扫描,对池化核中的矩阵值进行计算,一般有两种计算方式:
Max pooling:取池化核矩阵中的最大值
Average pooling:取池化核矩阵中的平均值 扫描的过程中同样地会涉及的扫描步长stride,扫描方式同卷积层一样,先从左到右扫描,结束则向下移动布长大小,再从左到右。
图像经最大化池化后会变模糊,类似于马赛克的效果。
参考链接:
cnn输入层_深入理解卷积神经网络(CNN)_weixin_39784263的博客-CSDN博客
CNN中卷积层的计算细节 - 知乎
[鱼书笔记] 深度学习入门:基于 Python 的理论与实现 个人笔记分享 - 呼啸山楂 - 博客园 (cnblogs.com)
听六小桨讲AI | 第2期:卷积的批量计算及应用案例 - 腾讯云开发者社区-腾讯云 (tencent.com)
神经网络——最大池化_放牛儿的博客-CSDN博客_最大池化