首页 > 代码库 > 记录神经网络中一些小知识点

记录神经网络中一些小知识点

记录神经网络中一些小知识点

1 Caffe中的blob维度

  • Caffe中的blob具有4个维度,分别是num,channel,width和height;
  • 其中我们在定义各个网络层时,常用到的一个参数numout,就是指定的channel;
  • 比如说,维度为1*3*5*5的数据输入网络(即每次输入一张5*5大小的3通道图),经过一个stride为2,pad为1,kernel为2,numout为2的卷积层后,维度就变成了1*2*3*3;
    • 假如输入有n个通道,计算时,caffe就会对应产生n个filter来与之相乘,然后将得到的这n个乘积加起来,这个计算过程最后产生一个channel;
    • 假如输出的numout为m,就会有m个上述计算过程;
    • 可参考下图
  • 我们经常能看到在一些网络里,使用1*1kernel大小的卷积层来降维,就是这个原因;googlenet里也用来减少网络参数。
    技术分享

2 1*1卷积核的作用

  • 实现跨通道的交互和信息整合。
    • CNN中的卷积大都是多通道的feature map和多通道的卷积核之间的操作(如上面第一点所说,输入多通道的feature map和对应数目的卷积核做卷积求和,然后输出1个通道的feature map);
    • 如果使用1x1的卷积核,这个操作实现的就是多个feature map的线性组合,可以实现feature map在通道个数上的变化;
    • 当接在普通的卷积层的后面,配合激活函数,就可以实现network in network的结构了。
  • 进行卷积核通道数的降维和升维。

    • GoogLeNet中,对于每一个Inception模块(如下图),原始模块是a图,b图中是加入了1×1卷积进行降维的。
    • 以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,如果是a图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,而b图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。
    • GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)。
      技术分享
      技术分享

    • ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,使得卷积层的输入和输出的通道数都减小,参数数量进一步减少,如下图的结构。
      技术分享

  • 另外,最近在Titan X上训练fcn,迭代了1500次后,内存就爆炸了。

    • 考虑应该是网络连接数太多了,将caffemodel保存下来,发现有1.2G;
    • finetuning时,如果载入的模型太大,可以考虑迭代小数目次数后,就存一下caffemodel,然后载入新保存的caffemodel来finetuning,因为weight也很耗显存,如果finetuning只利用到里面的几层,又载入了全卷积这些连接数庞大的层,不划算,故建议尽早重载model;
    • 打算尝试1*1卷积核,看能不能把网络连接数降到可接受范围内。

3 感受野计算

  • 感受野(receptive field)是卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
  • 下图中,map 3里1x1的区域对应map 2的receptive field是那个红色的7x7的区域,而map 2里7x7的区域对应于map 1的receptive field是蓝色的11x11的区域,所以map 3里1x1的区域对应map 1的receptive field是蓝色的11x11的区域。
    技术分享
  • 计算方式
    • 对于Convolution/Pooling layer:
      ri=si?(ri+1?1)+ki
      <script id="MathJax-Element-16" type="math/tex; mode=display">r_i=s_i?(r_{i+1}?1)+k_i</script>
    • 对于Neuron layer(ReLU/Sigmoid/…):
      ri=ri+1
      <script id="MathJax-Element-17" type="math/tex; mode=display">r_i=r_{i+1}</script>
    • 其中ri<script id="MathJax-Element-18" type="math/tex">r_i</script>表示第i层layer的输入的某个区域,si<script id="MathJax-Element-19" type="math/tex">s_i</script>表示第i层layer的步长,ki<script id="MathJax-Element-20" type="math/tex">k_i</script>表示kernel size。
  • 注意
    • 计算感受野时,忽略图像边缘的影响,即不考虑padding的大小;
    • 最深层感受野的大小等于滤波器的大小;
    • 计算的时候采用top to down的方式, 即先计算最深层在前一层上的感受野,然后逐渐传递到第一层。

4 Caffe做fine-tuning注意事项

  • fine-tuning时可能遇到报错:
    • 现象:[Caffe]: Check failed: ShapeEquals(proto) shape mismatch (reshape not set)
    • 原因:加载的caffemodel会根据prototxt中layer的name来进行参数赋值;但是如果你更改了layer的参数(包括但不限于输入数据的维度numout等),caffemodel就会难以和新的网络匹配;
    • 解决办法:如果修改了网络参数,就要修改相应layer的name,如此一来,加载caffemodel时就不会载入pre-train的参数,从而避免参数和数据不匹配;当然,没有加载pre-train参数的部分结构则会重新初始化。

5 fcn生成的概率图具有颗粒状/马赛克

  • 使用fcn做分割,生成的概率图不连续,有明显的颗粒感或者马赛克。
    依次为: 原图 -> 马赛克概率图 -> 正常连续概率图
    技术分享技术分享技术分享

  • 解决办法

    • 转置卷积层的stride最好别设置为和kernal相等,最好小一些,比如1/2;
    • 多个不同stage的转置卷积层的top进行concat时,要先将转置卷积层的top与最近的convolution层的top进行eltwise操作,再进行后面concat,否则,预测时就会出现这种马赛克概率图。

6 可视化小工具推荐

  • Quick Start - Netscope

    • github上的一个小项目,可以可视化Caffe的网络文件(prototxt);
    • 尽管caffe有可视化的python接口,但这个工具在左边栏修改网络结构,可通过Shift+Enter在右边栏一键可视化,有点编译器的味道;
    • 如下图
      技术分享
  • 3D Visualization of a Convolutional Neural Network

    • 这是一个LeNet的特征可视化工具,在左上角的框输入一个数字,能够看到LeNet每一层学习到的特征是什么样的。

本篇博客参考自
《CaffeCN社区(caffecn.cn)- 1X1卷积核到底有什么作用呢? 》

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    记录神经网络中一些小知识点