cs231n Convolutional Neural Network 笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangxb35/article/details/69568415

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 的时候,用较小的学习率

猜你喜欢

转载自blog.csdn.net/zhangxb35/article/details/69568415