卷积神经网络笔记
来源:
卷积神经网络笔记
目录:
文章目录
卷积神经网络笔记
卷积神经网络,英文缩写:CNNs/ConvNets
与常规神经网络的相同点:
- 都是由神经元组成
- 有具有学习能力的权重和偏差
- 神经元得到**数据,内积之后计算**函数
- 评分函数可导
- 输入是图像,输出是评分
- 具有损失函数
不同点: - 假设输入数据是图像。
- 添加了特有属性
- 前向传播高效
- 参数数量大幅降低
结构概述
常规神经网络中,图片大小太大导致参数过多,产生了两个缺点:
- 效率低下
- 容易过拟合
卷积神经网络的神经元是三维排列的。 - 宽度
- 高度
- 深度
这里的深度指的是**数据体的第三个维度,不是整个网络的深度。
卷积神经网络与普通神经网路有个区别:
层中的神经元与前一层并不是全连接,而是与一小块相连接。
用来构建卷积神经网络的各种层
三种类型的层:
- 卷积层
- 汇聚(
Pooling
)层 - 全连接层
一个CIFAR-10
的层如下:
- 卷积神经网络的结构,就是用一系列的层将输入变成输出。
- 输入和输出都是3D数据
- 参数和超参数不是谁都有。
层 | 参数 | 额外的超参数 |
---|---|---|
卷积层 | 有 | 有 |
ReLU层 | 无 | 无 |
汇聚层 | 无 | 有 |
全连接层 | 有 | 有 |
卷积层
核心、计算量大。
卷积层在算什么
卷积层到底在计算什么?首先先来明确一下下面的概念都是什么意思:
输入
直观上来讲,输入就是图片。而图片是什么?图片是一个矩阵,这个好理解。比方说一个彩色图片就是一个的矩阵。这里的w、h分别是宽、高,3代表的是彩色。
这里的3就成为卷积层的深度。
滤波器
滤波器英文为filter
,什么是滤波器呢?
滤波器也是一个矩阵。
滤波器的深度,也称第三个维度的长度,和卷积层的深度一致,比方说彩色图像的话,采用的滤波器(矩阵)的大小就是。
每个滤波器对应一个深度
所有滤波器的输出在深度方向上叠加起来就形成了输出数据。
局部连接
图像的维度很高,因此不能采用全连接,否则计算量将很大很大。只能和其中的一部分连接,连接的空间大小称为神经元的感受野(receptive field
)。
可以用下面的图解释是如何连接的:
左边是输入数据,蓝色部分是卷积层,蓝色部分里面的长方体是其中一组神经元,在深度方向上有5个,他们的感受野相同。
其实只需要关注下面的部分:
最后只是在这个模型里进行神经元的计算。
空间排列
控制输出体尺寸的参数:
- 深度(
depth
) - 步长(
stride
) - 零填充(
zero-padding
)
输入的空间形状如果是正方形,那么输出数据体的尺寸就可以用下面的公式表示:
(W-F+2P)/S+1
参数如下:
参数名称 | 符号 |
---|---|
感受野尺寸 | F |
步长 | S |
零填充的数量 | P |
深度
上方的图中:
沿着深度方向排列、感受野相同的神经元集合称为深度列(
depth column
),也称纤维(fibre
)
步长
滤波器滑动的时候,需要指定步长。所谓滑动,指的就是输入数据与滤波器计算的时候进行的移动操作,而步长就是一次移动多少,一般取1、2,更大的不常用。
零填充
在输入数据的边缘处填充0,称为零填充。因为有时候滤波器不能正好覆盖所有的数据,填充之后就能覆盖了。
参数共享
在卷积层中使用参数共享可以控制参数的数量。
Numpy例子
没有看懂
性质总结
假设输入数据体的尺寸为
具有以下超参数:
- 滤波器的数量K
- 滤波器的空间尺寸F
- 步长S
- 零填充数量P
那么计算输出数据体的尺寸为:
计算的动态演示图
如图所示,首先计算对应的蓝色矩阵和红色矩阵各元素的乘积之和,然后加上偏差,得到第一个深度上其中的一个值。
- 输入数据的每一层与滤波器的每一层计算
- 每一个滤波器形成一层的输出
- 每次计算只是一层深度上的一个值
用矩阵乘法实现
- 拉伸输入数据
- 拉伸权重
- 进行矩阵乘法
np.dot(W_row, X_col)
- 重新还原为
汇聚层
汇聚层的功能:降低数据体的空间尺寸,减少网络参数数量。
常见形式:使用尺寸的滤波器,以步长为2对每个深度切片进行降采样。
公式
参数名称 | 符号 |
---|---|
输入数据体尺寸 | |
空间大小 | |
步长 | |
输出数据体尺寸 |
其中,输出数据体尺寸计算公式如下:
\begin{aligned}
W_2 &= (W_1-F)/S+1 \\
H_2 &= (H_1-F)/S+1 \\
D_2 &= D_1
\end{aligned}
常用形式
最大汇聚
重叠汇聚(overlapping pooling
):
更大的汇聚尺寸:
普通汇聚(General Pooling)
平均汇聚(average pooling
)和L-2范式汇聚(L2-norm pooling
)。
实践证明,最大汇聚的效果比平均汇聚要好。
汇聚层在输入数据体的每个深度切片上,独立的对其进行空间上的降采样。这里的降采样,值得就是类似于卷积层使用滤波器在原始数据上滑动,汇聚层也在卷积层的输出上滑动,不同的是,滤波器进行的是逐个元素相乘然后求和,汇聚层只是取最大值,作为新位置上的元素。
不适用汇聚层
- 可以在卷积层中使用较大的步长来降低数据体的尺寸。
- 训练一个良好的生成模型时,弃用汇聚层也是很重要的。
归一化层
已经不再流行,因为效果即时存在,也是十分有限。
全连接层
矩阵乘法+偏差,可以**网络。
全连接层与成卷积层
区别
全连接层和卷积层之间的惟一的区别:
卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数。
两种变换
- 对于任意一个卷积层,都存在一个能实现和它一样的前向传播函数的全连接层。
- 任何全连接层都可以被转化成卷积层,只要将滤波器的尺寸设置成和输入数据体的尺寸一致。
全连接层转化为卷积层
这里没有看懂
卷积神经网络的结构
三种结构
- 卷积层
- 汇聚层
- 全连接层
另外还有ReLU
**函数,也可以作为第一层。
层的排列规律
- 一般都是卷积层和ReLU层放在一起,然后紧随汇聚层,一直重复,知道图像在空间中被缩小到一个足够小的尺寸。
- 几个小的滤波器层的组合比一个大滤波器卷积层好。
常见的卷积神经网络结构如下:
INPUT -> [[conv -> RELU] * N -> POOL?] * M -> [FC -> RELU] * k -> FC
层的尺寸设置规律
输入层
输入层的大小应该能够被2整除很多次。
卷积层
应该使用小尺寸滤波器(如3x3,最多5x5),使用步长S=1.要对数据进行零填充,目的是为了不改变输入数据在空间维度上的尺寸。
汇聚层
负责对输入数据的空间维度进行降采样。常用的shezhi :
参数 | 值 |
---|---|
感受野 | 2x2 |
步长 | 2 |
卷积层中使用步长为1,可以让空间维度的降采样完全由汇聚层负责,而卷积层只负责对输入数据体的深度进行变换。
案例学习(LeNet/AlexNet/ZFNet/GoogLeNet/VGGNet)
一些网络的历史、得奖情况。
计算上的考量
三种内存占用来源(GPU的内存):
- 来自中间数据体的尺寸
- 来自参数的尺寸
- 各种零散的内存占用。
内存不够用的时候,可以降低批尺寸(batch size
)。