全球名校课程作业分享系列--斯坦福计算机视觉与深度学习CS231n之基于cifar10的卷积神经网络实践

Posted 寒小阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全球名校课程作业分享系列--斯坦福计算机视觉与深度学习CS231n之基于cifar10的卷积神经网络实践相关的知识,希望对你有一定的参考价值。

课程作业原地址:CS231n Assignment 1
作业及整理:@张铮 && @郭承坤 && @寒小阳
时间:2018年2月。
出处:http://blog.csdn.net/han_xiaoyang/article/details/79278917


问题描述:使用IPython Notebook(现版本为jupyter notebook,如果安装anaconda完整版会内置),在ConvolutionalNetworks.ipynb文件中,你将实现几个卷积神经网络中常用的新层。使用CIFAR-10数据,训练出一个深度较浅的卷积神经网络,最后尽你所能训练出一个最佳的神经网络。


任务

实现卷积神经网络卷积层的前向计算与反向传导
实现卷积神经网络池化层的前向计算与反向传导
卷积层与池化层的加速


卷积神经网络结构

常规神经网络的输入是一个向量,经一系列隐层的转换后,全连接输出。在分类问题中,它输出的值被看做是不同类别的评分值。

神经网络的输入可不可以是图片呢?

常规神经网络对于大尺寸图像效果不尽人意。图片的像素点过多,处理起来极为复杂。因此在处理图片的过程中较为合理地降维成为了一个研究方向。于是,在基本神经网络的结构上,衍生出了一种新的神经网络结构,我们称之为卷积神经网络

下图是一个传统多层卷积神经网络结构:

可以看出,上图网络结构开始为“卷积层(CONV),relu层(RELU),池化层(POOL)”C-R-P周期循环,最后由全连接层(FC)输出结果。


注:实际应用的过程中常常不限于C-R-P循环,也有可能是C-C-R-P等等

设激活函数为 fsigmoid() f s i g m o i d ( − ) ,池化操作为 pool() p o o l ( − ) ,x代表输入的图像像素矩阵,w代表过滤层(卷积核),b代表偏置。C-R-P周期则有下面的计算公式:

xlj=pool(frelu(iMjxl1iwlij+blj)) x j l = p o o l ( f r e l u ( ∑ i ∈ M j x i l − 1 ∗ w i j l + b j l ) )
卷积神经网络的理解比较困难,为了更好地理解,我们先讲解过程再讨论实际应用。

卷积层的朴素(无加速算法)实现与理解

(在实际应用过程中,一般使用加速处理的卷积层,这里表现的是原始版本)

卷积层元素

下图是卷积层的元素:输入图片与过滤参数。

输入图片(image):输入层(Input Layer)有3个深度(D1,D2,D3,通常代表图片的三个通道RGB)。我可以将每个深度独立出来,看成三幅图片。图片的大小为32*32。

过滤参数(filter):过滤器有很多称呼,如“卷积核”、“过滤层”或者“特征检测器”。不要被名词坑了。过滤器也有3个深度(D1,D2,D3),就是与输入图片的深度进行一一对应,方便乘积操作。过滤器窗口一般比输入图片窗口小。

卷积层的前向计算

下图是卷积层的具体实现方法。

x代表图片image矩阵,w代表过滤层矩阵。各个过滤器分别与image的一部分进行点积,用点积结果排列成结果,这就是卷积过程。下面的动图就是卷积过程。

上图中我们看到每次窗口移动2格。这2格就是每次卷积的移动步长

我们看到原来的图片在周围填充了一圈0。填充0的宽度即为每次卷积的填充宽度padding(上图的填充宽度就是1)

移动步长很好理解,但为什么要填充呢?假设我们不填充。如下图:

会发现每次卷积之后都会有维度降低。浅层卷积网络可能没有什么问题。但是深层卷积可能在网络没到最后的时候维度即降为0。
这显然不是我们所希望的。

当然,如果有意愿用卷积计算去降维也可以,不过我们更喜欢用池化层的池化操作降维。为甚?因为卷基层和池化层各有分工!我们先来了解卷积层的作用。

卷积层正向卷积过程代码实现

def conv_forward_naive(x, w, b, conv_param):
    """
    A naive implementation of the forward pass for a convolutional layer.

    The input consists of N data points, each with C channels, height H and
    width W. We convolve each input with F different filters, where each filter
    spans all C channels and has height HH and width HH.

    Input:
    - x: Input data of shape (N, C, H, W)
    - w: Filter weights of shape (F, C, HH, WW)
    - b: Biases, of shape (F,)
    - conv_param: A dictionary with the following keys:
      - 'stride': The number of pixels between adjacent receptive fields in the
        horizontal and vertical directions.
      - 'pad': The number of pixels that will be used to zero-pad the input.

    Returns a tuple of:
    - out: Output data, of shape (N, F, H', W') where H' and W' are given by
      H' = 1 + (H + 2 * pad - HH) / stride
      W' = 1 + (W + 2 * pad - WW) / stride
    - cache: (x, w, b, conv_param)
    """
    ##########################################################################################
    # TODO: Implement the convolutional forward pass.    任务:完成带卷积操作的前向传播          #
    # Hint: you can use the function np.pad for padding. 提示:可以使用np.pad函数实现padding操作 #
    ##########################################################################################
    N, C, H, W = x.shape        # N个样本,C个通道,H的高度,W的宽度
    F, C, HH, WW = w.shape      # F个过滤器,C个通道,HH的过滤器高度,WW的过滤器宽度
    stride = conv_param['stride']   # 过滤器每次移动的步长
    pad = conv_param['pad']         # 图片填充的宽度

    ## 计算卷积结果矩阵的大小并分配全零值占位
    new_H = 1 + int((H + 2 * pad - HH) / stride)
    new_W = 1 + int((W + 2 * pad - WW) / stride)
    out = np.zeros([N, F, new_H, new_W])

    ## 卷积开始
    for n in range(N):
        for f in range(F):
            ## 临时分配(new_H, new_W)大小的全偏移项卷积矩阵,(即提前加上偏移项b[f])
            conv_newH_newW = np.ones([new_H, new_W])*b[f]
            for c in range(C):
                ## 填充原始矩阵,填充大小为pad,填充值为0
                pedded_x = np.lib.pad(x[n, c], pad_width=pad, mode='constant', constant_values=0)
                for i in range(new_H):
                    for j in range(new_W):
                        conv_newH_newW[i, j] +=  np.sum(pedded_x[i * stride: i * stride+HH, j * stride: j * stride + WW] * w[f, c, :, :] )
                out[n,f] = conv_newH_newW
    ###########################################################################
    #                             END OF YOUR CODE                            #
    ###########################################################################
    cache = (x, w, b, conv_param)
    return out, cache

卷积层的个人理解

对卷积层的作用,很多人的说法莫衷一是。我这里谈谈自己的理解(未必精准)。

1. 实现某像素点多通道以及周围信息的整合

说白了就是将一个像素与其周围的点建立联系。我们用将一点及其周边“卷”起来求和计算。那么每一层卷积必然是将一个像素点与周围建立联系的过程。

这么说起来“Convolution”翻译为“卷和”更恰当,其实卷积的“积”就是积分的意思

2. 我们先讲一个丧心病狂的故事

如果你每天总偷看别的美女不注意女朋友,那么女朋友每天都要扇你一巴掌。打你一巴掌后,脸的一部分就肿了。你的脸就是图片,女朋友的巴掌就是卷积核层。每打一巴掌,相当于“卷积核”作用脸部一个地方“做卷积”。脸肿了相当于脸部“卷积后”输出的结果。
如果有一天,女友忍无可忍,连续扇你嘴巴,那么问题就出现了:上一次扇你鼓起来的包还没消肿,第二个巴掌就来了,这就是多层“卷积”。

女友再狠一点,频率越来越高,以至于你都辨别不清时间间隔了。那么,求和就变成积分了。使用“积分运算的卷积”就是我们在大学数学《概率论与数理统计》中学到的“卷积运算”。

女友打你在不同的位置,自然会有不同的身体反应。根据打你后卷积后身体的反应卷积结果可以判断出打到什么位置了。

身体反应(卷积结果)可能推论
肿了打到脸了
红了打到肚子了
没反应打到骨头了
女友手疼打到骨刺了
更爱她了变态
没有感觉单身狗的幻想
这么一解释卷积层的解释果然很明显。。。。嗯,对。。。。我自己都信了。。。。

3. 图像处理中模板的概念

图片卷积不是一个新概念,在传统图像处理中就有与“卷积运算”相同的“模板运算”。模板即一个矩阵方块,在这里你可以认为是卷积核,模板运算方法与卷积运算方法相同。如下面的一个模板

19111111111 1 9 ∗ [ 1 1 1 1 1 1 1 1 1 ]
图片用这个模板进行运算后,可以得到类似于如下的效果。

上面的那种模板就是“低通滤波模板”的一种。
通过改变方阵的数值与大小,可以生成很多新的模板。如“高通滤波模板”,“边缘检测模板”,“匹配滤波边缘检测模板”等等。。不同的模板运用在不同的场景中。

那么又问题来了:我们该在什么时候,用什么数值的模板?

答案比价复杂。传统的模板选择,凭借的是算法工程师们的经验。但现在,我们不怕了!~~神经网络帮我们训练模板的参数。在多层神经网络中,图片可以添加很多个模板(即卷积层),一个或多个模板(卷积层)负责一项工作。图片在卷积神经网络的一次前向过程,就相当于对图像做一次特定的处理。

卷积层反向求导

前面我们介绍了卷积层的前向计算。大致了解了卷积的作用,但是神经网络的参数是怎么来的呢?参数的获取是一个迭代的训练的过程,每次反向传播都纠正参数,减小误差。(具体细节请看Q1~Q3中关于神经网络“前向计算,反向传播”的讲解。)
上文提到了C-R-P周期计算公式。

xlj=pool(frelu(iMjxl1iwlij+blj)) x j l = p o o l ( f r e l u ( ∑ i ∈ M j x i l − 1 ∗ w i j l + b j l ) )
frelu() f r e l u ( − ) 为relu激活函数,池化操作用 pool() p o o l ( − ) 表示,像像素矩阵,w代表过滤层(卷积核),b代表偏置。编写卷积层反向传播时,暂时不用考虑池化层,与激活函数。我们可以用g()代指卷积层后所有的操作。所以这一层的反向对x求导可以简化为如下操作。
g(xw+b)=g(out)out=xw+bgx=go全球名校课程作业分享系列--斯坦福计算机视觉与深度学习CS231n之SVM图像分类

全球名校课程作业分享系列--斯坦福计算机视觉与深度学习CS231n之特征抽取与图像分类提升

全球名校课程作业分享系列--斯坦福计算机视觉与深度学习CS231n之softmax图像多分类

全球名校课程作业分享系列--斯坦福计算机视觉与深度学习CS231n之神经网络细解与优化尝试

全球名校课程作业分享系列--斯坦福计算机视觉与深度学习CS231n之双层神经网络完成图像多分类

全球名校课程作业分享系列--斯坦福计算机视觉与深度学习CS231n之基于cifar10的卷积神经网络实践