课程note中讲了一些工程经验,感觉很有用,记下来供自己以后查阅
- 相比于大的滤波器,小滤波器更受青睐。小滤波器参数更少、计算量更小、能够表达更多的特征,做反向传播时需要的内存更少。
- 通常不会考虑创建一个新的网络结构。一般都会找一些在ImageNet上有较好表现的预训练网络,下载下来然后做finetune
- input layer通常是2的倍数,比如32(CIFAR-10),96(STL-10)
- conv layer通常使用小滤波器(3x3 或 5x5),stride=1,做padding保证卷积层不会改变输入的维数
- 如果必须使用大的滤波器(7x7),就在第一层使用,输入为原图像。
- pooling layer通常使用2x2 max-pooling with stride=2或者不常用的3x3 with stride =2
- 大于3的pooling几乎不会做,因为会带来很大的信息损失,进而网络结构表示很差。
- 为什么通常stride=1,因为实际中小的stride的效果更好,而且可以把down-sampling交给pooling层,conv层只做输入的体积转换
- 为了减少内存限制,通常对网络进行压缩。一般在第一个卷积层执行,比如ZF net 使用了7x7滤波器 stride=2,AlexNet使用了11x11 滤波器 stride =4
- 通常如果GPU内存不够的话,可以考虑减小batch size,因为大多数内存消耗都是由activation layers造成的。