首页 > 代码库 > 记录神经网络中一些小知识点
记录神经网络中一些小知识点
记录神经网络中一些小知识点
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:<script id="MathJax-Element-16" type="math/tex; mode=display">r_i=s_i?(r_{i+1}?1)+k_i</script>
ri=si?(ri+1?1)+ki - 对于Neuron layer(ReLU/Sigmoid/…):<script id="MathJax-Element-17" type="math/tex; mode=display">r_i=r_{i+1}</script>
ri=ri+1 - 其中
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。
- 对于Convolution/Pooling layer:
- 注意
- 计算感受野时,忽略图像边缘的影响,即不考虑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卷积核到底有什么作用呢? 》
记录神经网络中一些小知识点
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。