CNN

CNN基本概念

CNN特性

==FC:全局信息,global信息能减少误检;==
==conv:局部信息==

conv特性:平移不变性;

CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。

卷积核的多个filters表示检测不同的特征;

  1. 尺度不变性不够鲁棒

2. padding

2.1 定义

  • “VALID” :即no padding,当stride超过图片区域时,会丢掉最右边的列(或最底部的行)。
  • “SAME” :即用0来padding,尝试向左和向右均匀填充。但如果要添加的列数是奇数,它将向右添加额外的列(或底部添加额外的行)

特别地,stride=1时
same:输出与输入大小相同;

示例如下:
image

2.2 tensorflow与caffe实现的微小区别

参考:https://blog.csdn.net/wuzqChom/article/details/74785643

2.2.1 tensorflow中padding的实现

1
2
3
4
5
6
7
If padding == "SAME":
output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i])

If padding == "VALID":
output_spatial_shape[i] =
ceil((input_spatial_shape[i] - spatial_filter_shape[i]+1)
* dilation_rate[i] / strides[i]).

由源代码中的定义可知,

对于same,输出形状计算如下:

image

对于Valid,输出形状计算如下:

image

图中符号为向上取整

2.2.2 caffe中padding的实现

卷积层和池化层的padding实现有些不同;

stride=1时,卷积层和池化层的padding:
h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1

stride>1时,

  • 卷积层的padding:
    top_size = floor((bottom_size + 2*pad - kernel_size) / stride) + 1
  • 池化层的padding:
    top_size = ceil((bottom_size + 2*pad - kernel_size) / stride) + 1

(池化是向上取整)

2.2.3 tensorflow和caffe中padding实现的对比总结

  • strides不为1时需要自己计算一下pad值,尤其是tf中右边多一个pad的情况 caffe下似乎不支持,caffe只支持左右对称pad
  • stride为1时,tensorflow和caffe的实现是等价的;

代替全连接层(卷积化Convolutionalize )

1. 全卷积网络的措施

直观上理解,卷积跟全连接都是一个点乘的操作,区别在于卷积是作用在一个局部的区域,而全连接是对于整个输入而言,那么只要把卷积作用的区域扩大为整个输入,那就变成全连接了,所以我们只需要把卷积核变成跟输入的一个map的大小一样就可以了,这样的话就相当于使得卷积跟全连接层的参数一样多。

举个例子,比如AlexNet,fc6的输入是256x6x6,那么这时候只需要把fc6变成是卷积核为6x6×(256x6x6)的卷积层就好了,其中卷积核的通道数为输入变成一维向量后的维度数,如此处filters为256x6x6

文章来源:https://read01.com/kE66P.html

文章来源:https://read01.com/kE66P.html

2. NIN网络的措施

1*1卷积+GAP+softmax

Global average pooling的意义是对整个网络从结构上做正则化防止过拟合。

网络的参数量

  1. 池化层的参数数量是0

==因为参数是指需要反向传播时训练需要学习的参数,而池化层没有;==

无论max pooling还是mean pooling,都没有需要学习的参数。因此,在卷积神经网络的训练中,Pooling层需要做的仅仅是将误差项传递到上一层,而没有梯度的计算。

(1)max pooling层:下一层的误差项的值会原封不动的传递到上一层对应区块中的最大值所对应的神经元,而其他神经元的误差项的值都是0;

(2)mean pooling层:下一层的误差项的值会平均分配到上一层对应区块中的所有神经元。

feature map尺寸计算

卷积是向下取整,poolinpooling是向上取整