zoukankan      html  css  js  c++  java
  • 2. CNN卷积网络-前向传播算法

    1. CNN卷积网络-初识

    2. CNN卷积网络-前向传播算法

    3. CNN卷积网络-反向更新

    1. 前言

    我们已经了解了CNN的结构,CNN主要结构有输入层,一些卷积层和池化层,后面是DNN全连接层,最后是Softmax激活函数的输出层。这里我们用一个彩色的汽车样本的图像识别再从感官上回顾下CNN的结构。图中的CONV即为卷积层,POOL即为池化层,而FC即为DNN全连接层,包括了我们上面最后的用Softmax激活函数的输出层。

    image

    2. 卷积层的前向传播

    还是以上面的图片作为例子。

    先考虑最简单的,样本都是二维的黑白图片。这样输入层(X)就是一个矩阵,矩阵的值等于图片的各个像素位置的值。这时和卷积层相连的卷积核(W)就也是矩阵。

    如果样本都是有RGB的彩色图片,这样输入(X)就是3个矩阵,即分别对应([R,G,B])的矩阵,或者说是一个张量。这时和卷积层相连的卷积核(W)就也是张量,对应的最后一维的维度为3.即每个卷积核都是3个子矩阵组成。

    同样的方法,对于3D的彩色图片之类的样本,我们的输入(X)可以是4维,5维的张量,那么对应的卷积核W也是个高维的张量。

    不管维度多高,对于我们的输入,前向传播的过程可以表示为:

    [a^2= sigma(z^2) = sigma(a^1*W^2 +b^2) ]

    其中,上标代表层数,星号代表卷积,而(b)代表我们的偏倚, (sigma)为激活函数,这里一般都是(ReLU)

    和DNN的前向传播比较一下,其实形式非常的像,只是我们这儿是张量的卷积,而不是矩阵的乘法。同时由于(W)是张量,那么同样的位置,(W)参数的个数就比DNN多很多了。

    为了简化我们的描述,本文后面如果没有特殊说明,我们都默认输入是3维的张量,即用(RBG)可以表示的彩色图片。

    这里需要我们自己定义的CNN模型参数是:

    1. 一般我们的卷积核不止一个,比如有(K)个,那么我们输入层的输出,或者说第二层卷积层的对应的输入就(K)个。
    2. 卷积核中每个子矩阵的的大小,一般我们都用子矩阵为方阵的卷积核,比如([F,F])的子矩阵。
    3. 填充padding(以下简称P),我们卷积的时候,为了可以更好的识别边缘,一般都会在输入矩阵在周围加上若干圈的0再进行卷积,加多少圈则(P)为多少。
    4. 步幅stride(以下简称S),即在卷积过程中每次移动的像素距离大小。

    3. 池化层的前向传播

    池化层的处理逻辑是比较简单的,我们的目的就是对输入的矩阵进行缩小概括。比如输入的若干矩阵是([N,N])维的,而我们的池化大小是([k,k])的区域,则输出的矩阵都是([N_k,N_k])维的。

    这里需要需要我们定义的CNN模型参数是:

    1. 池化区域的大小(k)
    2. 池化的标准,一般是MAX或者Average。

    4. 全连接层的前向传播

    由于全连接层就是普通的DNN模型结构,因此我们可以直接使用DNN的前向传播算法逻辑,即:

    [a^l = sigma(z^l) = sigma(W^la^{l-1} + b^l) ]

    5. 总结

    有了上面的基础,我们现在总结下CNN的前向传播算法。

    输入:1个图片样本,CNN模型的层数(L)和所有隐藏层的类型,对于卷积层,要定义卷积核的大小(K),卷积核子矩阵的维度(F),填充大小(P),步幅(S)。对于池化层,要定义池化区域大小k和池化标准(MAX或Average),对于全连接层,要定义全连接层的激活函数(输出层除外)和各层的神经元个数。

    输出:CNN模型的输出(a_L)

    1. 根据输入层的填充大小(P),填充原始图片的边缘,得到输入张量(a_1)
    2. 初始化所有隐藏层的参数(W,b)
    3. (for;;l=2;;to;;L-1):
      1. 如果第(l)层是卷积层,则输出为(a^l= ReLU(z^l) = ReLU(a^{l-1}*W^l +b^l))
      2. 如果第(l)层是池化层,则输出为(a_l=pool(a_{l-1})), 这里的pool指按照池化区域大小(k)和池化标准将输入张量缩小的过程。
      3. 如果第(l)层是全连接层,则输出为(a^l= sigma(z^l) = sigma(W^la^{l-1} +b^l))
    4. 对于输出层第(L)层:(a^L= softmax(z^L) = softmax(W^La^{L-1} +b^L))

    以上就是CNN前向传播算法的过程总结。有了CNN前向传播算法的基础,我们后面再来理解CNN的反向传播算法就简单多了。下一篇我们来讨论CNN的反向传播算法。

  • 相关阅读:
    smtplib文字邮件的发送
    接口测试框架分析
    UnitTest框架的快速构建与运行
    Appium + Python App自动化第一个脚本
    3个必备cookie实用方法
    单元测试框架的选择
    快速构建一个完整的Selenium框架
    SSH原理与运用
    springboot 集成 spring-data-elasticsearch
    Java 集合排序
  • 原文地址:https://www.cnblogs.com/huangyc/p/10024370.html
Copyright © 2011-2022 走看看