卷积神经网络在视觉识别任务上的表现令人称奇。好的 CNN 网络是带有上百万参数和许多隐含层的『庞然怪物』。事实上,一个不好的经验规则是:网络越深,效果越好。AlexNet,VGG,Inception(GoogleNet)和 ResNet 是最近一些流行的 CNN 网络。
AlexNet
AlexNet 是一个较早应用在 ImageNet 上的深度网络,其准确度相比传统方法有一个很大的提升。它首先是5个卷积层,然后紧跟着是 3 个全连接层,如下图所示:
VGG16
VGG16 是牛津大学 VGG 组提出的。VGG16 相比 AlexNet 的一个改进是采用连续的几个 3×3 的卷积核代替 AlexNet 中的较大卷积核(11×11,5×5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。
GoogLeNet/Inception
尽管 VGG 可以在 ImageNet 上表现很好,但是将其部署在一个适度大小的 GPU 上是困难的,因为需要VGG在内存和时间上的计算要求很高。由于卷积层的通道数过大,VGG 并不高效。比如,一个 3×3 的卷积核,如果其输入和输出的通道数均为 512,那么需要的计算量为 9x512x512。
在卷积操作中,输出特征图上某一个位置,其是与所有的输入特征图是相连的,这是一种密集连接结构。GoogLeNet 基于这样的理念:在深度网路中大部分的激活值是不必要的(为0),或者由于相关性是冗余。因此,最高效的深度网路架构应该是激活值之间是稀疏连接的,这意味着 512 个输出特征图是没有必要与所有的 512 输入特征图相连。存在一些技术可以对网络进行剪枝来得到稀疏权重或者连接。但是稀疏卷积核的乘法在 BLAS 和 CuBlas 中并没有优化,这反而造成稀疏连接结构比密集结构更慢。
据此,GoogLeNet 设计了一种称为 inception 的模块,这个模块使用密集结构来近似一个稀疏的 CNN,如下图所示。前面说过,只有很少一部分神经元是真正有效的,所以一种特定大小的卷积核数量设置得非常小。同时,GoogLeNet 使用了不同大小的卷积核来抓取不同大小的感受。
ResNet
从前面可以看到,随着网络深度增加,网络的准确度应该同步增加,当然要注意过拟合问题。但是网络深度增加的一个问题在于这些增加的层是参数更新的信号,因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小。这意味着这些层基本上学习停滞了,这就是梯度消失问题。深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差。残差网络 ResNet 设计一种残差模块让我们可以训练更深的网络。
经典图像识别数据集
INRIA Person 行人数据集
目前使用最多的静态行人检测数据集,由『HOG + SVM』的作者 Dalal 创建(2005年)。训练集有正样本 614 张(包含 2,416 个行人),负样本 1,218 张;测试集有正样本 288 张(包含 1,126 个行人),负样本 453 张。下载地址。
KITTI 车辆检测数据集
这是一个测试交通场景中的车辆检测、追踪、语义分割等算法的公开数据集。由丰田汽车主导,目前在测试自动驾驶等识别算法中应用比较多。实际上,KITTI 已经成为 ADAS 行业的实际效果检测标准。下载地址。