PyTorch自动驾驶视觉感知算法实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.1 卷积神经网络的输入层

卷积神经网络的输入以图片为主,RGB图片被看作是一个三维张量。但这个三维张量不能直接输入到神经网络中,需要对其进行预处理(Preprocessing)。

1.输入归一化

和传统的机器学习一样,卷积神经网络也要对输入进行归一化(Normalization)。归一化的方法有很多种,最终目的是把数据的取值范围压缩到一个较小的区间。

最简单的预处理方法是最小最大归一化(Min-Max Normalization)。假设第i个输入数据是Xi,整个数据集用X表示,最大最小归一化的计算方法如下:

如果输入数据是图像,图像数据的RGB值一般是0~255之间,所以只需把输入的图像数据除以255,归一化就完成了。通过最大最小归一化,输入数据将被压缩到0和1之间。

另一种归一化方法也称标准归一化(Standardization),这种标准归一化方法需要计算整个数据集的平均值和标准差,计算方法为:

式中,μ是整个数据集的平均值,对于图像数据而言就是所有RGB值的平均值;σ是整个数据集的标准差,也就是所有像素点RGB值的标准差。标准化后的数据均值为0,最小值和最大值则会根据输入数据的分布变化,一般在-3和3之间。

为什么要归一化?解释有很多种,其中一种是从优化算法的角度来考虑。图1-12所示是一个机器学习模型的损失面等高线,横轴和纵轴代表的是模型的两个参数。这两个参数可以有无数种可能性,每一组参数形成的模型都可以算出一个损失值,这就形成了一个损失曲面。图中从外围浅色的部分到内部深色的部分,损失值逐渐减小,而优化算法的目标就是要找到一组让损失最小的参数,也就是图中深色区域的参数。图1-12a所示是直接使用原始数据作为输入产生的损失面,图1-12b所示是使用归一化数据作为输入产生的损失面。箭头代表使用梯度下降法进行优化时参数更新的方向,因为使用了梯度下降法,参数的更新总是朝着梯度最大的方向,也就是垂直于等高线的方向进行。

• 图1-12 梯度下降算法在不同输入数据下的表现

显然,要从初始位置到达损失值较小的目标区域,使用归一化后损失曲面更规则,优化起来速度更快,绕的弯路更少。而原始数据输入参数的两个维度尺度差异很大,导致其相应的权重差异也很大,损失面就产生了扭曲。

还可以从另一个角度出发来理解,后文会介绍,模型最终的输出一般都位于-3到3之间。如果输入数据的范围是0~255,那么神经网络的一个任务就是要把0~255的数据投射到-3到3之间。不进行输入归一化的话,神经网络就需要通过优化去完成这个任务。而神经网络的参数是有限的,交给模型去完成的任务当然越少越好,既然已经知道这个先验知识,何不直接代劳,帮模型完成这个任务。使用最大最小归一化,相当于帮模型完成了一部分任务,使用标准归一化,则可以认为是完全代劳了。相较于最大最小归一化,使用标准归一化的做法可以提高大约0.5%的精确度。

2.数据扩增(Data Augmentation)

输入数据预处理的另外一项重要任务就是数据扩增。图1-13所示很好地展示了图像数据扩增到底是做什么的。图中左上角是原始图片,其他图片都是扩增的图片。

• 图1-13 数据扩增

如果神经网络的任务是识别第一张图片中的鹦鹉,那么这个模型也应该能识别出其他图片中的鹦鹉。这对于人类而言是很轻松的任务,而神经网络的目标是赶超人类。也就是说,数据扩增是通过对图片进行受限制的随机处理,生成新的数据。标注数据的成本很高,通过数据扩增,相当于免费获得了新的数据。如图1-13所示,一共使用了11种不同的数据扩增方法,等于把数据集扩大了11倍。数据扩增还能让神经网络更加健壮(Robust),如果不进行数据扩增,神经网络很可能只会学到“鹦鹉就是红色的鸟”这样的特征,但哪怕图中的鹦鹉是绿色的或是黑白的,人类仍然可以识别出来这是一只鹦鹉。数据扩增可以防止神经网络学习到错误的,或者说过于简单的特征。