1.感受卷积神经网络的强大
卷积神经网络
玩转神经网络的步骤:
应用:classification, retrieval, detection, segmentation,姿态估计(回归任务)
Detection:分类+回归。(找到BBox,BBox中的物体究竟是什么物体呢)
2.卷积层详解
左:经典神经网络,是全连接结构
右:卷积神经网络,有一个深度的概念,贯穿始终
卷积神经网络的组成
&&重点是卷积层和池化层
卷积操作:用filter在图像(可看作被分成若干块)上进行特征提取,找出可以代表这个区域的值。卷积就是在原图上进行一部分一部分的特征提取,之后可以得到特征图。
filter助手的深度与连接的输入的深度必须一致。
可以多设置几个filter,方便提取不同的特征。把提取出来的特征压缩到一起。就得到了最终卷积的结果。
卷积操作可以在图像上提取特征,也可以在卷积的结果(特征图)上提取特征,即可以对特征进行特征提取。
3.卷积计算流程
特征不断的进行压缩和提取。在图像上滑动的区域与filter的大小有关,确定窗口大小。
stride = 2:滑动步长为2
4.卷积核参数分析
stride:卷积网络的步长,会影响所得特征图的大小。
要选择合适的stride。如果stride过大,那么会漏掉图像的信息。如果stride过小,虽然可以得到更多的特征信息,但是卷积计算量太大,有点得不偿失。
Pad:更好的利用边缘信息,让边缘的像素点贡献增大。Pad=1表示在原始图像的基础上添加1圈0。
特征图的大小与原始图的大小的关系计算:
5.卷积参数共享原则
上图表明特征图大小的计算方式。
假设是神经网络的结构,那参数就多了,不存在参数共享的机制。
神经网络的情况,全连接
参数共享:卷积网络可以进行权重共享,所以就不用考虑什么一千个点了。
6.池化层(Pooling)原理
pooling不是对原始输入图像进行操作,而是对特征图来做的。
对特征图进行压缩,或者说是进行特征的浓缩。
池化层没有权重参数。有两种方式:mean和max
pooling会使得特征图的大小急剧下降。所以,pooling也叫做downsampling。也是要造窗口,用filter表明对应特征图区域的大小,进行特征提取操作。
通常把conv+relu看成一个整体。最后与FC相连,再用从FC层得到的特征完成分类或者回归任务。
7.卷积神经网络反向传播原理
卷积层和池化层的前向传播和反向传播的计算方式。
卷积层的前向传播 w*x + b
x[n,c,h,w],n表示batch中的图片编号,图片的个数,c表示通道个数或者特征图的个数。
filter的深度要与前一层的深度完全一样。
卷积层的反向传播
dout是传下来的梯度,x是自身的梯度。
pooling的前向传播和反向传播
8.实现卷积层的前向传播和反向传播
案例实战
完成卷积后,总共有多少张特征图。num_filters
要计算的窗口大小filter_size
要让初始化参数小一些,小到weight_scale倍。
reg是正则化惩罚项
把所有的值转换成float32的形式,dtype = np.float32
Note:ReLU 和conv之间是没有参数的。pooling和relu之间也是没有参数的。只有卷积层和FC层之间是有参数的。
pad的经典选择:pad = (filter_size - 1) / 2
9.实现Pooling层的前向传播和反向传播
代码详情参见:https://github.com/sunshinezhihuo/cnn
前向传播中特征图的计算
卷积层的反向传播
max pooling的前向传播
max pooling的反向传播
10.经典卷积网络架构实例
AlexNet:
图解:
在1998年,已经可以用卷积神经网络做手写体识别了。
2012年,AlexNet横空出世。
Conv1:96 个助手用于提取特征。filter大小是11*11,太大了,实际是不利于提取特征的。pad是0,stride为4,只是粗粒度的提取图像特征。可以通过调节这些值完成细粒度的特征提取。
Conv2:256个助手。原因:在进行pooling后,特征图大小发生了明显的改变,不能很好的表达之前的输入。所以要使得特征图的深度增加,以更好的表达之前的输入。–可以更好的表达输入的特征。
pooling:选择同样大小的
Conv3,Conv4,Conv5:特征图大小,输入和输出不发生变化。在保证特征图不变的情况下,不断的进行卷积操作。
全连接操作dense:占内存,费参数。把之前所提取的特征都连在一起。
VGGNet:–较AlexNet深度更深,有更多的卷积层和池化层
特点:计算特征还是蛮细粒度的。
VGG16
训练一个16层的VGGNet所需的内存和参数。
memory:相当于立方体的体积