DNN in hard way:卷积层

来源:互联网 发布:施耐德网络面板接线图 编辑:程序博客网 时间:2024/06/01 22:04

卷积层

在上面的几篇文章中,我们已经看到了全链接层的威力,但是,这还远远不够。在本文中,我们将看到DNN的一个重要特性,卷积层。
熟悉信号处理的朋友对于卷积的概念不会陌生,这就是我们常用的滤波。只是在很多应用场景中,不是我们常见的一维滤波,而是图像处理中常见的2D滤波(比如最常见的锐化,就是一个简单的高通滤波)。在深度学习的术语中,滤波器被叫做卷积核(kernal)。
在以图像为输入的DNN网络中,一个卷积核其实是针对于输入所有通道的一个滤波器组(group of filters)。比如以常见的MNIST数据为例,每个输入数据是28x28x3的像素集合(28x28是尺寸,3是RGB 通道)。一种常见的卷积核尺寸是5x5x3,就是说每5x5x3的立方体内所有的像素点都与系数做内积,得到输出的特征图上的一个点。
卷积核的常见参数包括

参数 含义 H×W Heights and Width CI×CO 输入与输出的信号数目 S Stride 步长,即滤波器每次移动的像素点数,也可以理解为滤波之后的降采样因子 P Padding,填充。为了保持输出的尺寸在输入边界的位置填入的“0”的数目

经过简单的计算可以得到,在长或者宽的维度上,输入尺寸HDI×WDI×CI与输出尺寸HDO×WDO×CO之间的关系可以表述为

HDO=HDI+Ptop+PbottomHKSH+1WDO=WDI+Pleft+PrightWKSW+1

一般而言,为了简化控制流,我们会约定
Ptop=Pbottom=Pleft=Pright=PSH=SW=S

下面这篇文章对于卷积层的归纳相当不错,对比来看就会发现,还是信号处理中熟悉的味道 :)。
https://zhuanlan.zhihu.com/p/30074309?utm_source=wechat_session&utm_medium=social

卷积层的计算

正向传播

卷积层的正向传播和反向传播的基本运算是单通道的2D卷积(滤波)。为了简化下文的推导和展示,本文添加了一个虚拟层来表示单通道 2D卷积的输出。虚拟层进行加权求和之后可以得到卷积层的真正输出。

vcx,cyp,q=i,jxcxpSi,qSjwcx,cyi,jycyp,q=cxvcx,cyp,q=cx,i,jxcxpSi,qSjwcx,cyi,j

我们定义,p,q 代表在图像平面上的坐标。cx=1CI 代表输入的通道号,cy=1CO 代表输出的通道号。
从上面的计算可以看到,一个卷积层需要的参数的数目是HK×WK×CI×CO(bias未计入),通常而言这都是一个非常巨大的数目。即使是一个最简单的MNIST训练集和一层卷积层,你就会很明显的感受到训练速度的下降。

反向传播

简单起见,在进行反向传播的推导过程中,本文将仅仅计算最简单的S=1的情况。对于步长大于1 的情况,相当于在虚拟的卷积输出层进行upsample操作之后再进行反向传播计算。

dxcxp,q=cy,i,jdycyp+i,q+jycyp+i,q+jxcxp,q=cy,i,jdycyp+i,q+jwcx,cyi,j=cy,i,jdycypi,qjwcx,cyi,j

从上面的式子可以看出,卷积层的反向传播也是2D卷积的求和,只是区别在于要将二维卷积系数进行上下和左右的反转。

系数更新

卷积层的系数更新跟全连接层并没有太大的变化。

Jwcx,cyi,j=cy,p,qdycyp,qycyp,qwcx,cyi,j=cy,p,qdycyp,qxcxpi,qj

深度可分离的卷积(Depth-Separatable)

下面一部分是对于深度可分离的卷积的一点想法。如上面所述,可以将一个完整的卷积层拆分为两层,一个是二维的平面卷积,另外一个是将平面卷积结果作为输入的一维卷积(类似于全连接层)。

vcxp,q=i,jxcxpSi,qSjwcxi,jycyp,q=cxβcx,cyvcxp,q

这样的话,参数的数目将为HK×WK×CI+CO

我们来分两步看反向传播。vy 相当于一个全连接层。

dvcxp,qJβcx,cy=cydycyp,qβcx,cy=p,qdycyp,qvcxp,q

xv 是二维卷积。
dxcxp,qJwcxi,j=i,jdvcxp+i,q+jwcxi,j=i,jwcxi,jcyβcx,cydycypi,qj=p,qdvcxp,qxcxpi,qj