6.1 从全连接到卷积
我们之前讨论的多层感知机十分适合处理表格数据,其中行对应样本,列对应特征。但面对更加高纬度的数据,这种缺少结构的网络可能会变得不实用。
对图片进行降维,将面临百万级的特征维度,再假设输出的维度为1000,那么参数将达到10的九次方,结果可想而知。
然而为什么现在还能实现图片分类呢?因为换了一种思考角度,不再将维度展平,而是考虑了图片的结构特征。
6.1.1 不变性
想象一下,假设我们想从一张图片中找到某个物体。 合理的假设是:无论哪种方法找到这个物体,都应该和物体的位置无关。(只要在,就能找到)
6.1.1.1 平移不变性
不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。(该怎么计算,就怎么计算)
6.1.1.2 局部性
神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。
6.1.2 通道
此外,由于输入图像是三维的,我们的隐藏表示H也最好采用三维张量(可以再当做输入,传入卷积层等)。我们可以把隐藏表示想象为一系列具有二维张量的通道(channel)。这些通道有时也被称为特征映射(feature maps),因为每个通道都向后续层提供一组空间化的学习特征。
直观上可以想象在靠近输入的底层,一些通道专门识别边缘,而一些通道专门识别纹理。
6.1.3 小结
- 图像的平移不变性使我们以相同的方式处理局部图像,而不在乎它的位置。
- 局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。
- 在图像处理中,卷积层通常比全连接层需要更少的参数,但依旧获得高效用的模型。
- 卷积神经网络(CNN)是一类特殊的神经网络,它可以包含多个卷积层。
- 多个输入和输出通道使模型在每个空间位置可以获取图像的多方面特征。
6.2 多输入多输出通道
当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。(卷积核的输出通道维度自定义)
这是一个三维的卷积核,后面会介绍四维的。
6.2.1 1X1卷积层
1X1卷积,看起来似乎没有多大的意义,但用途体现在其他方面。
卷积核的 kernel_size
自定义,这就占了两个维度(行和列),卷积核的输入通道数和样本(传入的数据)的通道保持一致,这就是第三个维度了。那我们4维卷积,还有1维呢?
还有一个维度,决定了输出结果的通道数。(上述例子的输出通道为2)
好好理解一下,卷积层中的 输入通道和输出通道
6.2.2 小结
卷积层可以在保持输入样本(行和列)不变的情况下,拓展通道数
6.3 汇聚层
回想一下我们的目标,是要识别图片。之前抱怨特征太多,那为什么经过卷积层,我们的特征反而可能变多了呢?(不一定变多,可能输出通道变少了)
原因是,我们还有降低空间维度的办法。
汇聚层又叫池化层。池化层的作用是对特征进行降维,提高后续特征的感受野,也就是让池化后的一个像素对应前面图片的一个区域。
6.3.1 最大汇聚层和平均汇聚层
6.3.2 小结
- 对于给定输入元素,最大汇聚层会输出该窗口内的最大值,平均汇聚层会输出该窗口内的平均值。
- 汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。
- 我们可以指定汇聚层的填充和步幅。
- 使用最大汇聚层以及大于1的步幅,可减少空间维度(如图片高度和宽度)。
- 汇聚层的输出通道数与输入通道数相同。
6.6 LeNet卷积神经网络
net = nn.Sequential(
# 定义一个卷积层 [输入通道,输出通道] = [1, 6] 卷积核大小为5×5, 对图片进行边缘填充
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(), # sigmoid非线性化
nn.AvgPool2d(kernel_size=2, stride=2), # 平均值池化 池化窗口为2×2,步长为2 ===> 图片的行和列两个维度 除2 (减半)
# 上一个卷积层的输出通道为6,所以对应本层的输入样本的通道为6,所以输入通道为6
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(), # 没有边缘填充, 边缘(下面和右边)的4个像素将消失
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(), # 展平, 准备进入接下来的 全连接层
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10))
# 关于Linear的参数W) 两个维度,其实对应着 输入特征的维度和输出特征的维度
对于这里第一列的全部都是1,一开始我也很疑惑。但这个size描述的不是 对应层的形状,而是经过这个层后,输出的结果的形状。因为样本只有1个,所以第一位就全都是1。
前一层的输出通道,将变成下一层的输入通道
所以,上述的输出结果,可以理解为: 卷积的输出形状由批量大小、通道数、高度、宽度决定。