CNNs: Architectures, Convolution / Pooling Layers
CovNet Layers
ConvNet 显示地假设输入是图片,卷积池化等操作大大减少了参数,比一般的全连接网络计算更高效。CNN 里具体有下面的几种结构,
卷积层, Convolutional Layer
- Dilated convolutions 就是做点乘的时候,也有个stride,而不是连续的九宫格
池化, Pooling Layer
- Pooling Layer 往往加在两个连续的卷积之间,能有效减少空间大小和计算量,而且能控制过拟合。
- 有些生成模型不需要池化,如 VAEs(variational autoencoders), GANs
- overlapping pooling,就是 stride 有重叠
- max-pooling
- average-pooling
- L2-norm pooling
ReLU, Activation Layer
- 全连接层, Fully Connected Layer
从输入到 feature map 大小计算公式如下,
feature_map_size = ( input_size - filter_size + 2 * padding ) / stride + 1
- input_size 如 ImageNet 的图片是 224 x 224 x 3
- filter_size 卷积核大小,必须是奇数,如 3x3
- padding 在图片的边界的填充的大小,可以取 0
- stride 在 Pooling 层的步伐大小,比如 1
怎么理解 CNN 中的权值共享和局部感受野的概念?
- 其实就是很多的不同的卷积核沿着整个输入图片的卷积操作。
怎么理解卷积核数量和feature map数量是对应的?
- 同一个卷积核的 depth 和输入的 depth 是一致的,但是是在所有的通道上做卷积运算后加起来,因此得到的feature map是单通道的
- 所以有通过 1x1 的卷积核来降低通道的做法。
ConvNet Architectures
一般的CNN可以这么搭建,
INPUT -> [ [CONV -> ReLU ] * N –> POOL? ] * M –> [ FC -> ReLU ] * K –> FC
为什么想要多层的小的卷积核?
- 现在的模型更倾向于用更多更深的小卷积核而非单层的大卷积,比如三层3x3的卷积层(带池化吧?可是文中没有提到)就可以有7x7一样的感受野范围,但是由于三层之间加了非线性的激活函数,所以表达能力更强一些。且用的卷积核参数更少。
- 唯一的缺点就是,如果要做反向传播的话,需要更多的内存来保留中间激活值。
Case Studies
Network | Source & Author | Source | Notes |
---|---|---|---|
LeNet | Yann LeCun | ||
AlexNet | Alex Krizhevsky etc. | The ILSVRC 2012 winner | |
ZF Net | The ILSVRC 2013 winner | ||
GoogLeNet | Google Inc. | The ILSVRC 2014 winner, Inception | 4M parameters, compared to AlexNet with 60M. see Inception-v4 |
VGGNet | Oxford | The ILSVRC 2015 second prize | Deeper, 104M parameters, in last FC layer |
ResNet | MSRA | The ILSVRC 2015 winner | ResNet-2016, refer to torch-facebook |
misc/miscellaneous 混杂的,杂项的参数
参数与内存大小
- 基本上把参数的个数算一下转换成byte,乘以4(float浮点数),或者乘以8(double),就是参数占用的内存大小
- 如果减小batchsize能很大程度上减少内存大小,说明这个模型中的激活值占了很大比重。
Understanding and Visualizing CNNs
关于神经网络模型是否具有可解释性(interpretable),可以通过可视化来探讨。
- Visualize feature map
- 随着训练的进行,ReLU层后的激活值从 blooby and dense 从 sparse and localized
- Visualize weights(filters)
- nice and smooth filters without any noisy patterns
- 把能很大程度上激活某些神经元的输入收集起来,能发现一些特点,比如某些神经元只对眼睛感兴趣,某些神经元只对房子感兴趣等。
有些人认为,神经元(ReLU neuros) 不一定会有语义信息(semantic meaning),也可能只是图片块的空间表示的向量基底而已。(it is more appropriate to think of multiple ReLU neurons as the basis vectors of some space that represents in image patches)
t-SNE
t-SNE 可以将原始的图片嵌入到二维的空间内,同时保持他们在低维的距离和在高维的距离是一样的。低位的相似度关注的是语义和标签类,而非像素点和颜色。
Tansfer Learning and Fine-tuning CNNs
实际应用中,一般很少白手起家地(from scratch)训练一个CNN,因为数据集往往都不够大。更好的做法是,用别人训练好的模型作初始化,或者特征提取器。
卷基层作为特征提取器
直接把训练好的模型,如AlexNet的最后一层的分类器去掉,然后接一个自己的分类器,每次反向传播的时候,并不调整原来的权重。提取的特征,比如 2048D 的向量,称作是CNN code
精确调参的卷积(Fine-turning the ConvNet)
就是说在用别人的模型时,继续训练参数;当然也可以控制前几层的参数固定,调整后面高层的网络。
Caffe library 有个 Model Zoo 【link1 and link2】,人们可以分享他们的模型 checkpoints
什么时候和怎么精确调参?
新数据集大小 | 和原始数据集 | 建议 |
---|---|---|
很小 | 很像 | train a linear classifier on the CNN code |
很大 | 很像 | retrain |
很小 | 不像 | 用前几层,做特征提取,训练线性分类器 |
很大 | 不像 | train a ConvNet from scratch |
实际经验和建议
- 预训练的模型的限制 CNN的参数,其实对输入的图片的大小没有强制性的限制,因为卷基层保留的参数都是卷积核
- fine-tuned 的时候,用较小的学习率