1. 图像基础知识
1.1 图像构成
图像是由像素点组成的,每个像素点的取值范围为: [0, 255] 。像素值越接近于0,颜色越暗,接近于黑色;像素值越接近于255,颜色越亮,接近于白色。
在深度学习中,我们使用的图像大多是彩色图,彩色图由RGB3个通道组成,每个通道包括图片的高和宽(H, W),则形状为(H, W, C),如下图所示
1.2 图像绘制
- plt.imread()
- plt.show()
2. CNN网络概述
卷积神经网络(Convolutional Neural Network)是含有卷积层的神经网络. 卷积层的作用就是用来自动学习、提取图像的特征.
CNN网络主要由三部分构成:卷积层、池化层和全连接层构成:
- 卷积层负责提取图像中的局部特征;
- 池化层用来大幅降低参数量级(降维);
- 全连接层用来输出想要的结果。
2.1 卷积层
2.1.1 卷积层计算过程
卷积运算本质上就是在卷积核和输入数据的局部区域间做点积。
- input:输入的图像
- filter:卷积核(滤波矩阵)
- Output:input 经过 filter 得到输出为最右侧的图像,该图叫做特征图
2.1.2 Padding
通过卷积计算过程,最终的特征图比原始图像小很多,如果想要保持经过卷积后的图像大小不变, 可以在原图周围添加 padding 来实现,即在原始图片上加N圈0.
2.1.3 Stride
Stride表示步长,为卷积核提取一次特征后向后移动的大小,默认为1,下图表示按步长为2提取特征图
2.1.4 多通道卷积核计算
对于三通道的彩色图片来说,滤波矩阵也是三通道的,获得的特征图是一维的
其计算过程如下图所示:
那么为了获取多通道的特征图片,就需要添加多个卷积核。
2.1.4 特征图大小计算
输出特征图的大小与以下参数息息相关:
1. size: 卷积核/过滤器大小,一般会选择为奇数,比如有 1*1 、3*3、5*5
2. Padding: 零填充的方式
3. Stride: 步长
计算公式:
1. 输入图像大小: W x W
2. 卷积核大小: F x F
3. Stride: S
4. Padding: P
5. 输出图像大小: N x N
2.1.5 卷积层API
2.2 池化层
池化层 (Pooling) 降低维度, 缩减模型大小,提高计算速度.
2.2.1 池化层计算
- 最大池化(首选)
- 平均池化
2.2.2 Stride和Padding
2.2.3 多通道池化层计算
对于多通道输入,输出的通道数与输入的通道数是一致的
2.2.4 池化层API
3. 图像分类案例
- 了解 CIFAR10 数据集
- 搭建卷积神经网络
- 编写训练函数
- 编写预测函数
3.1 CIFAR10 数据集
CIFAR-10数据集5万张训练图像、1万张测试图像、10个类别、每个类别有6k个图像,图像大小32×32×3。下图列举了10个类,每一类随机展示了10张图片:
PyTorch 中的 torchvision.datasets 计算机视觉模块封装了 CIFAR10 数据集, 使用方法如下
3.2 构建卷积神经网络
我们要构建的神经网络结构如下:
- 输入形状: 32x32
- 第一个卷积层输入 3 个 Channel, 输出 6 个 Channel, Kernel Size 为: 3x3
- 第一个池化层输入 30x30, 输出 15x15, Kernel Size 为: 2x2, Stride 为: 2
- 第二个卷积层输入 6 个 Channel, 输出 16 个 Channel, Kernel Size 为 3x3
- 第二个池化层输入 13x13, 输出 6x6, Kernel Size 为: 2x2, Stride 为: 2
- 第一个全连接层输入 576 维, 输出 120 维
- 第二个全连接层输入 120 维, 输出 84 维
- 最后的输出层输入 84 维, 输出 10 维
我们在每个卷积计算之后应用 relu 激活函数来给网络增加非线性因素。