caffe常用层Convolution,SoftmaxLayer和SoftmaxLossLayer原理解析

写在前面:昨天面试,面试官问各种关于caffe的问题,之前以为自己对caffe很熟,但是竟然一问三不知,深受打击。主要这段时间一直在看C++基础算法部分,都没怎么复习caffe,看来是人老了,脑子跟不上了,趁着双休,好好把caffe过一遍。主要是对常用层原理的一些说明
参考caffe的api document:http://caffe.berkeleyvision.org/doxygen/annotated.html
1.ConvolutionLayer:caffe最核心的层,主要的方法在BaseConvolutionLayer类里面,caffe里面很机智的把卷积操作变成矩阵的乘法,但这是怎么实现的呢?这里面就是用到了im2col(图像转矩阵)和col2im(矩阵转图像)两个函数。
单通道卷积,一张图表示:
caffe常用层Convolution,SoftmaxLayer和SoftmaxLossLayer原理解析_第1张图片
M:卷积核的个数
K:=k*k,卷积核长乘宽
N:滑窗在input上移动了多少次,实际上就是output的像素点个数,即output的长乘宽
再看最右边输出的,一行就是一个filter map。
多通道卷积,还是一张图表示:
caffe常用层Convolution,SoftmaxLayer和SoftmaxLossLayer原理解析_第2张图片
实际上就是对每张图都进行单通道卷积,但是最后多通道是怎么进行矩阵操作的呢?在多通道卷积的时候,当我们定义filter的参数:filter map输出个数n,长宽为w,k时,实际上,caffe里面就自己加了个多通道,数目设为c,这时候单个卷积核的size=w*k*c,在进行矩阵操作时,一个卷积核就成了1*(w*k*c)的一维行向量,这样理解起来实际上也挺简单的(LZ之前一直以为多通道卷积的时候,一个filter map可能不会包含所有的通道,现在想起来有点可笑了,没文化,真可怕)总之一句话,多通道的时候,实际进行卷积操作的时候,实际卷积核的size会乘上通道数。具体为什么这么做,现在比较多的说法是因为GPU矩阵乘法高效性,就是为了用上GPU,一个字,快。
参考资料:
(1)http://blog.csdn.net/zhangzhenyuancs/article/details/52252271
(2)http://blog.csdn.net/u014381600/article/details/60883856
2.SoftmaxLayer和SoftmaxLossLayer
先说softmaxLayer,softmax实际上就是logistic的扩展,后者只能二分类,前者则能多分类,实际上都是返回每一类的概率值。在caffe里面softmax的实现分为以下几步(加入输入到softmax里面的结点数为10):
1)找出输入的最大值,输入的每个变量减去最大值,取指数(e为底);
2)对1)中结果归一化,得出的结果就是每一类的分类概率。
softmaxLoss实际上就是个代价函数,我们要让分类正确的概率最大,然后我们对这个概率取log对数,由于代价函数都是最小化,所以我们在log前面加个负号。caffe中都是以batch为单位进行训练的,所以计算loss的时候都是以batch为单位求和取平均。
3.InnerProductLayer,全连接层
全连接层的作用:1)起到分类器的作用;2)由于FC参数规模较大,所以可保持较大的模型capacity从而保证模型表示能力的迁移
caffe里面的全连接层可能分成两种,一种是全连接层之间连接,一种是卷积层和全连接层之间连接。
第一种,全连接层之间连接:就是我们所熟知的神经网络,本质上就是两个向量的乘积,即:
x=(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)
w=(w0,w1,w2,w3,w4,w5,w6,w7,w8,w9),w*x=x0*w0+x1*w1+x2*w2+x3*w3+x4*w4+x5*w5+x6*w6+x7*w7+x8*w8+x9*w9;
这样就可以得到下一个结点值(神经元)。若x为N*1,w为M*N,内积w*x为M维.实际上内积实现的全连接层实际上就是一个参数矩阵W与输入的N维向量X之间做矩阵相乘。
第二种,卷积层和全连接层间连接:实际原理和第一种是一样的,我们可以做一些变换得到:
由加法的结合律,得:w*x=(x0*w0+x1*w1+x2*w2)+(x3*w3+x4*w4+x5*w5)+(x6*w6+x7*w7+x8*w8+x9*w9);写成了三个小的内积之和,然后这不就是
输入X= x0 x1 x2 和 卷积核W= w0 w1 w2 之间
x3 x4 x5 w3 w4 w5
x6 x7 x8 w6 w7 w8
的卷积吗?
将上面两种方式之间的障碍转换一下,比如一个25*3*3的输入,卷积核为M*25*3*3,则输出为M*1*1,现在我们将输入flatten一下,特征个数没变还是25*3*3,没个卷积核flatten一行,则内积之后是M*1
简单点说就是,每一个卷积核和全连接的每个神经元之间的权值连接是一个矩阵,而不再是传统神经网络中的一个M*1的行向量,如果卷积层是25*3*3(25是filter map的个数),全连接层是25*1*1,那每个filter map
和每个神经元之间的则是一个1*9的矩阵,最后得到一个节点值
参考资料:
1)https://www.zhihu.com/question/23765351
2)http://blog.csdn.net/buyi_shizi/article/details/51496376
PS:以后要是感觉还有比较重要的层需要注意的还会在这篇博客里面更新,觉得不错的小伙伴可以收藏一波,觉得有错的地方,也可以指正。

你可能感兴趣的:(caffe)