目录
引入了解
卷积网络特点及由来
特点:非全连接,所以待学习参数减少;设计思路来源于自然图像中一些已知结构的创造性方法
由来
适合于计算机视觉的神经网络架构:
-
平移不变性(translation invariance):神经网络的前面几层应该对相同的图像具有相似的反应,不管相同的图像出现在整幅图中的哪个位置,即此情况下权重W和偏置b不随位置而变;
-
局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,下图可以形象地表示出
补充知识
1.“权重”别名:卷积核(convolution kernel)或者滤波器(filter)
2.卷积数学公式
两个函数两块区域内的“对应”相乘再求和,两块区域是有关联的,关联“特征”就是i,j
3.通道(channel)
把平面空间上每个位置(二维张量)都看作有一个通道,此通道里存储着一个多维向量。比如对于RGB图像的输入层,其一个通道里有一个三维向量。比如,可以将隐藏层描述为一系列具有二维张量的通道。
从整体去看一层,又可以理解为,一组隐藏是一些互相堆叠的二维网格,就像ps软件中堆叠的图层一样,如下图。
从数学公式上来看,一层的“加权”对应如下计算:
其中,H是一层的输出,X是一层的输入,V是卷积核,c是输入的“堆叠层数”,d是输出的“堆叠层数”,ab是局部区域内的位置增量,ij是输出的位置坐标
互相关运算(卷积运算)
这里“可视化”互相关运算,帮助更好地理解
互相关运算:在二维互相关运算中,卷积窗口从输入张量的左上角开始,从左到右、从上到下滑动。 当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到一个单一的标量值,由此我们得出了这一位置的输出张量值
严格卷积运算公式如下,可发现它与互相关运算的下标不完全相同
但大体上,可以粗略将两种对应:卷积窗口就是公式中的,核张量就是
,两者对应位置处对应相乘再求和即得到第三个“图”
输出维数
正常情况下,若输入是,卷积核是
,则输出维数是
这个很“固定”,通过“填充”、步幅”可以分别增加、减少维数,以达到实际中的需求。
填充
正常情况的卷积会使我们常常丢失边缘像素,处理手段是填充:在输入图像的边界填充元素(通常填充元素是0)。
如此,输出的维数将变为
步幅
我们将卷积窗口每次滑动元素的数量称为步幅,如此,输出的维数将变为
多通道下卷积运算
多输入单输出
卷积核的输入通道数与输入数据的通道数应该相同,即如果输入的通道数为,那么卷积核的输入通道数也需要为
。此时,如果卷积核的窗口形状是
,且
时,我们卷积核的每个输入通道将包含形状为
的张量。
计算过程:
1. 对每个通道输入的二维张量和对应的卷积核的二维张量进行互相关运算
2. 对通道求和(将的结果相加)得到二维张量
多输入多输出
用表示输出通道的数目,则卷积核的大小为
,此时计算过程为:
1. 将卷积核看成个并列独立的“组”,每“组”输出一个结果,这样就会有
维输出
2. 对每个“组”内分别做“多输入单输出”的互相关运算,步骤见上
代码实现
import torch
# 多输入单输出
def corr2d(X, K): #@save
"""计算二维互相关运算"""
h, w = K.shape
Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i:i + h, j:j + w] * K).sum()
return Y
def corr2d_multi_in(X, K):
# 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起
return sum(corr2d(x, k) for x, k in zip(X, K))
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])
y1 = corr2d_multi_in(X, K)
print(y1)
# 多输入多输出
def corr2d_multi_in_out(X, K):
# 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
# 最后将所有结果都叠加在一起
return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
K = torch.stack((K, K + 1, K + 2), 0)
y2 = corr2d_multi_in_out(X, K)
print(y2)
汇聚层
汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。
汇聚层的“窗口滑动”行为和卷积层相同,只是每一“步”不再是加权计算,仅仅计算汇聚窗口中所有元素的最大值或平均值。所以,汇聚层也不包含参数。举例如下图:
汇聚层的输出通道数与输入通道数相同。这意味着,汇聚层在每个输入通道上单独运算,并将结果直接送至对应的输出通道。
卷积神经网络
回顾之前我们用全连接层处理图像数据时,我们首先将每个大小为28×28的图像展平为一个784维的固定长度的一维向量,然后应用softmax回归和多层感知机对其进行处理。 而现在,我们已经掌握了卷积层的处理方法,我们可以在图像中保留空间结构。 同时,用卷积层代替全连接层的另一个好处是:模型更简洁、所需的参数更少。
LeNet
网络结构如下:
卷积层:使用5×5卷积核和一个sigmoid激活函数;第一个卷积层有6个输出通道,而第二个卷积层有16个输出通道;第一个卷积层填充2,第二个卷积层无填充
池化层:2×2池操作,且步幅为2
全连接层:分别有120、84和10个输出
摘抄于哈尔滨工业大学屈桢深老师的ppt
AlexNet
与训练端到端(从像素到分类结果)系统不同,经典机器学习的流水线如下:
1. 获取一个有趣的数据集。在早期,收集这些数据集需要昂贵的传感器
2. 根据光学、几何学、其他知识以及偶然的发现,手工对特征数据集进行预处理
3. 通过标准的特征提取算法,如SIFT(尺度不变特征变换) (Lowe, 2004)和SURF(加速鲁棒特征) (Bay et al., 2006)或其他手动调整的流水线来输入数据
4. 将提取的特征送入最喜欢的分类器中(例如线性模型或其它核方法),以训练分类器
那时,计算机视觉研究人员相信,从对最终模型精度的影响来说,更大或更干净的数据集、或是稍微改进的特征提取,比任何学习算法带来的进步要大得多。
2012年,AlexNet横空出世。它首次证明了学习到的特征可以超越手工设计的特征。它一举打破了计算机视觉研究的现状。
上面这幅图就是AlexNet的结构图,它与LeNet相比,区别如下:
AlexNet在训练时增加了大量的图像增强数据,如翻转、裁切和变色。 这使得模型更健壮,更大的样本量有效地减少了过拟合;
AlexNet卷积层使用ReLU激活函数;
AlexNet池化层采用最大池化层;
AlexNet通过暂退法控制全连接层的模型复杂度;
AlexNet采用了双数据流设计,使得每个GPU只负责存储和计算模型的一半参数。
AlexNet比相对较小的LeNet5要深得多。