• 深度学习原理与框架-卷积神经网络基本原理 1.卷积层的前向传播 2.卷积参数共享 3. 卷积后的维度计算 4. max池化操作 5.卷积流程图 6.卷积层的反向传播 7.池化层的反向传播


    卷积神经网络的应用:
    卷积神经网络使用卷积提取图像的特征来进行图像的分类和识别
             

         

                       分类                        相似图像搜索                                  目标识别                               语义分割

    卷积神经网络与神经网络的形状对比, 卷积是有厚度的

    卷积在提取特征时的图像变化,从刚开始较低水平的特征图,到最后较高水平的特征图的变化,原先提取的是图片的特征,后面提取到的是一些高级的分类特征

     

    1. 卷积的实际计算过程:假设样本的维度为N, C, H, W, 卷积的维度为F, C, H, W,   F表示有几个卷积核, C表示卷积的通道,每一个卷积都与每个特征图做一次卷积操作,即对应位置相乘操作,因此样本的通道和卷积的通道必须是相同的,最后将3个通道相乘的结果,进行加和,最后加上一个b,获得一个特征图, 卷积后的维度等于N, F, H, W

       

                             第一次卷积                                                    向右移动一个stride

    代码:

      # 将C通道分别进行相乘,和最后的相加操作,再加上一个b值,作为最后的输出
     out[i, f, j, k] = np.sum(x_pad[i, :, j*s:j*s+HH, k*s:k*s+WW] * w[f]) + b[f]

    2.  卷积的参数共享: 卷积的操作共享表示的是,对于一个特征图的卷积,只使用一个卷积核进行卷积,因此降低了参数的数量

    3. 卷积后的维度计算, 卷积后的维度,第一个维度:参与卷积样本的数目N, 第二个参数F,表示卷积核的个数,

    第三个参数: H_new = int(H-HH + 2*pad) / stride + 1, 第四个参数:W_new = int(W-WW + 2*pad) / stride + 1, 特征图维度W,卷积核维度WW, pad表示补零的层数,stride表示卷积核每次移动的步长

     

    代码:

    # 进行卷积后的H和W的维度计算
     H_new = int((H - HH + 2*pad) / stride + 1)
     W_new = int((W - WW + 2*pad) / stride + 1)

    4.pool池化操作, 为了在后续的操作中,可以更好的提取特征,因此压缩了矩阵的维度,池化操作分为两种:最大值池化和均值池化, 选择选框中最大的数作为池化的结果

       

                                    池化操作                                                                         最大值池化

    代码:

     # 将图像上卷积区域的最大值,赋值给池化后的数据
       out[i, c, j, k] = np.max(x[i, c, j*s:j*s+HH, k*s:k*s+WW])

    5.图像卷积的流程: 下图的卷积的流程:卷积-relu激活-卷积-relu激活-池化... 池化-全连接(进行图像的类别预测)

    6.  卷积的反向传播 , 卷积的反向传播,分为dx, dw, db

    对于dx = dout * w, dw = dout * x , db += dout  进行加和

    代码:

     # 获得前向传播的x
      windows = x_pad[i, :, j*s:j*s+HH, k*s:k*s+WW]
     # dw[f] = dout[i, f, j, k] * x 
      dw[f] += dout[i, f, j, k] * windows
     # dx = dout * w 
      dx[i, :, j*s:j*s+HH, k*s:k*s+WW] += dout[i, f, j, k] * w[f]
     # db[f] += dout[i, f, j, k] 
      db[f] += dout[i, f, j, k]

    7. 池化的反向传播

    获得前向传播的X, 构造(X == dout(i, f, j, k)) * dout(i, f, j, k),显示出[0, 0, 0, 6] 这样的矩阵

    代码:

      # 生成[[false, false],[false, True]]
        window = (np.array(x[i, c, j*s:j*s+HH, k*s:k*s+WW]) == dout[i, c, j, k])
      # [[false, false],[false, True]] * dout[i, c, j, k] = [[0, 0], [0, dout[i, c, j, k]]
        out[i, c, j*s:j*s+HH, k*s:k*s+WW] = window * dout[i, c, j, k]
  • 相关阅读:
    c++中结构体的使用
    指针、引用、引用和函数参数、引用和const、const 和 #define、#define的特殊用途
    用eclipice抓取JS代码
    UITableView读取plist文件
    GameKit框架简介、通过蓝牙实现对等网络连接
    照片选择步骤及部分代码
    通知(消息)机制(本地推送和远程推送及实现步骤)
    游戏中心-内购—应用内购买修改应用程序信息
    粒子效果的使用建议、粒子编辑器各属性说明
    如何判断用户是否登录
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/10511345.html
Copyright © 2020-2023  润新知