这是卷积神经网络笔记第七篇,完整的笔记目录可以点击这里查看。
1. ConvNet中每个层中使用的公共超参数常见设置
- 输入层(input layer)应该可以被2整除很多次。常用数字包括32(例如CIFAR-10)、64、96(例如STL-10)或224(例如Common ImageNet ConvNets)、384和512。
- conv层应使用小的过滤器(例如3x3或最多5x5),使用S=1的步长,最关键的是,用零来填充输入数据的边缘,这样conv层就不会改变输入图像的空间维度。也就是说,当F=3时,使用P=1将保留输入的原始大小。当F=5时,P=2。对于一般F,P=(F−1)/2可以保留输入图像的大小。(这里所提到的计算公式及变量含义可以参见这篇博客)
- 池化层负责对输入数据的空间维度进行降采样。最常见的设置是使用大小为2x2的最大池化(即F=2)),步幅为2(即S=2)。这正好丢弃了输入数据中75%的值(由于宽度和高度都减少了2个采样)。另一个稍微不太常见的设置是使用3x3的感受野,步幅为2。最大池化的感受野大小大于3是非常罕见的,因为池化太有损耗和攻击性。这通常会导致网络性能下降。
2. 几个相关问题的讨论
- 减少尺寸问题。上述方案令人满意,因为所有CONV层都保留其输入的空间大小,而POOL层单独负责在空间上对输入进行下采样。在另一种方案中,我们使用大于1的步长或在CONV层中不用0对输入的边缘进行填充。我们必须非常小心地跟踪整个CNN体系结构中的输入量,并确保所有的步长和过滤器都“正常工作”(不能正常工作的情况在这篇博客中也有介绍),并且ConvNet体系结构连接良好且对称。
- 为什么在CONV层中使用1的步幅?因为小步走在实践中效果更好。此外,如前所述,步长为1允许我们将所有空间下采样都留给POOL层来解决,CONV层仅按深度处理输入的图像。
- 为什么要用padding?除了上述在CONV之后保持空间大小不变的好处之外,这样做实际上提高了网络的性能。如果CONV层不对输入进行零填充并且只执行有效的卷积,那么在每次CONV之后,数据的大小将减少一小部分,并且边界处的信息将很快被“冲走”。
- 基于内存限制的妥协。在某些情况下(特别是在ConvNet体系结构的早期),根据上面介绍的经验法则,内存量会非常迅速地积累起来。例如,使用三个3x3 CONV层(每个层64个过滤器,padding为1)过滤224x224x3图像将生成三个大小为[224x224x64]的结果。这相当于总计约1000万次激活,即72MB内存(每张图像的激活值和梯度值)。在实践中,人们往往只在网络的第一层进行妥协。例如,一种折衷方法可能是使用过滤器大小为7x7、步长为2的第一个CONV层(如ZF net所示)。另一个例子是,AlexNet使用11x11的过滤器大小和4的步长。
3. 计算方面的考虑
您构造ConvNet体系结构时要注意的最大瓶颈是计算机内存。许多现代GPU的内存限制为3/4/6GB,最好的GPU大约有12GB的内存。内存消耗的来源主要有三个:
- 中间数据的大小:这包括在ConvNet的每一层激活的数据,以及它们的梯度(大小相等)。通常,大多数激活数据都在ConvNet的早期层上(即第一个Conv层)。它们之所以被保留是因为反向传播的计算需要用到它们,但是可以通过只存储任何层上的当前激活并删除前面层上先前的激活来减少这一数据量。
- 参数大小:包括网络参数、它们在反向传播期间的梯度等。如果优化使用momentum、Adagrad或RMSProp等方法,则通常也包括步长数据的缓存。因此,单独存储参数向量的存储器通常必须乘以至少3左右的因子。
- 每个ConvNet实现都必须维护各种各样的内存,比如图像数据等等。
一旦你粗略估计了计算数据的总数(包括激活值、梯度值和一些杂项),应该将其转换为以GB为单位的数值。估算方法是,取数值的个数,乘以4得到原始字节数(因为每个浮点数是4个字节,或者可能乘以8表示双精度),然后除以1024多次而得到内存量,单位依次为KB、MB、GB。如果你的网络内存消耗过大,一个常见的启发式“使其适合”方法是减少批处理的大小,因为大多数内存通常被激活值所消耗。
*本博客翻译总结自CS231n课程作业网站,该网站需要翻墙才能访问。