简单来讲,卷积核的大小通常小于输入图像的大小(若是等于则是全链接),所以卷积提取出的特征会更多地关注局部 —— 这很符合平常咱们接触到的图像处理。而每一个神经元其实没有必要对全局图像进行感知,只须要对局部进行感知,而后在更高层将局部的信息综合起来就获得了全局的信息。网络
参数共享最大的做用莫过于很大限度地减小运算量了。ide
通常咱们都不会只用一个卷积核对输入图像进行过滤,由于一个核的参数是固定的,其提取的特征也会单一化。这就有点像是咱们平时如何客观看待事物,必需要从多个角度分析事物,这样才能尽量地避免对该事物产生偏见。咱们也须要多个卷积核对输入图像进行卷积。spa
举例1:3d
好比输入是一个32x32x3的图像,3表示RGB三通道,每一个filter/kernel是5x5x3,一个卷积核产生一个feature map,下图中,有6个5x5x3的卷积核,故输出6个feature map(activation map),大小即为28x28x6。code
下图中,第二层到第三层,其中每一个卷积核大小为5x5x6,这里的6就是28x28x6中的6,二者须要相同,即每一个卷积核的“层数”须要与输入的“层数”一致。有几个卷积核,就输出几个feature map,下图中,与第二层做卷积的卷积核有10个,故输出的第三层有10个通道。blog
举例2:io
NxN大小的输入(暂时不考虑通道数),与FxF大小的卷积核(暂时不考虑个数)作卷积,那么输出大小为多大?计算公式为:(N - F) / stride + 1,其中stride为作卷积是相邻卷积核的距离。图像处理
举例3:class
当输入为7x7大小,卷积核为3x3,stride=1,在7x7周围补上一圈0(pad=1个像素),那么输出大小为多大?pdf
是7x7。
举例3:
输入为32x32x3,卷积核大小为5x5,总共有10个卷积核,作卷积的时候stride=1,pad=2,那么这一层总共含有多少参数?
每一个卷积核含有的参数个数为:5*5*3 + 1 = 76,其中1是偏置bias,因为有10个卷积核,故总参数为76*10=760。
总结:
其中,卷积核的数量K通常是2的整数次幂,这是由于计算方便(计算机计算2^n比较快)
Pooling 的意义,主要有两点:
参考:
斯坦福大学CS231N课程PPT
http://cs231n.stanford.edu/slides/2016/winter1516_lecture7.pdf
卷积操做有两个问题:
1. 图像愈来愈小;
2. 图像边界信息丢失,即有些图像角落和边界的信息发挥做用较少。所以须要padding。
卷积核大小一般为奇数
一方面是为了方便same卷积padding对称填充,左右两边对称补零;
n+2p-f+1=n
p=(f-1)/2
另外一方面,奇数过滤器有中心像素,便于肯定过滤器的位置。
“VALID”只会丢弃最右边没法扫描到的列(或者最底部没法扫描到的列)。
“SAME”试图在左右添加padding,但若是列添加的数量是奇数,则将额外的添加到右侧(即保持双数时,左右padding相通,偶数时,右侧/底部 比 左侧/顶部 多1),在垂直方向同理)。
Tensorflow中的定义
The TensorFlow Convolution example gives an overview about the difference between SAME and VALID : For the SAME padding, the output height and width are computed as: out_height = ceil(float(in_height) / float(strides[1])) out_width = ceil(float(in_width) / float(strides[2])) And For the VALID padding, the output height and width are computed as: out_height = ceil(float(in_height - filter_height + 1) / float(strides1)) out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
ceil为向上取整。
待完善