zoukankan      html  css  js  c++  java
  • 神经网络深层网络实现

    神经网络深层网络实现

    步骤

    1. 随机初始化数据
      • 对于权重(W^{[l]}), 一般采用(np.random.randn(l, l - 1) * sqrt{{1over{dimension of previous layer}}})
      • 如果当前的(l)层的激活函数为(ReLU), 则使用(He initialization), 也就是(np.random.randn(l, l - 1) * sqrt{{2over{dimension of previous layer}}})
      • 对于偏移量(b^{[l]}), 一般采用(np.zeros((l, 1)))
    2. 确定迭代次数
    3. 进入迭代循环
    4. 前向传播, 主要目的是计算出AL
      • 在神经网络中会有很多层, 如果要通过一个函数直接前向传播到最后一层得到AL太返回, 一般定义一个辅助函数, 该辅助函数计算特定一层的输出值, 并在循环中调用该函数
      • 如:
        • linear_activation_forward: 辅助函数
        • L_model_forward: 主函数
      • 分辅助函数的好处:
        • 降低编码的复杂度
        • 可以方便为每个层定义定义不同的(activate function)
    5. 计算Cost
    6. 计算(dAL), 目的是初始化反向传播的起点
    7. 反向传播, 主要目的是计算出grads
      • 与第4点一样, 我们一般定义一个辅助函数, 该辅助函数计算特定一层的梯度, 并在循环中调用该函数
      • 如:
        • linear_activation_backward: 辅助函数
        • L_model_backward: 主函数
      • 分辅助函数的好处:
        • 降低编码的复杂度
        • 可以方便为每个层定义定义不同的(activate function)
    8. 更新参数
    9. 达到了指定的迭代次数, 退出循环

    附加操作

    正则化

    • L2正则化:

      • 影响cost和back propagation
      • 在训练集和测试集中都会使用
    • Dropout正则化:

      • 影响forward propagation和back propagation
      • 只能在训练集中使用
      • 原理
        • 在前向传播的时候, 设定一个keep_prob参数, 当keep_prob为1表示保留, 在0-1之间表示有特定的概率被保留, 如果被删除, 也只是将我们原来得到的激活函数的值变为0
        • 在反向传播的时候, 依据前向传播, 得到的dA1等也要对应的为0或者其他
      • 应用: 在计算机视觉中十分常见

      激活函数选择

    • hidden layer中不会使用(sigmoid function), 但是在output layer, 如果是一个二分类问题, 使用(sigmoid function)

    • 一般地, 在hidden layer使用ReLU或者tanh

    • ReLU的导数: np.int64(relu(Z) > 0)

    Optimization Methods

    Mini-Batch

    • mini-batch size指的是一个mini-batch中含有的样本数量

    • 如果mini-batch size=m, 则为梯度下降, 当m很大的时候, 效率低

    • 如果mini-batch size=1, 则为随机梯度下降, 在下降的过程中有很多噪音; 会失去向量化的加速效果

    • 选择:

      • mini-batch size一般为64-512, 离散来讲为(2^6), (2^7), (2^8)
      • 如果数据量较小, 则直接使用batch梯度下降

    核对矩阵的维度

    • 参考:

      • (A^{[l]})(n_l imes m)维的矩阵
      • (W^{[l]}, W^{[l + 1]})都是矩阵
      • (X^{[l]})(n_x imes m)维的矩阵
    • 在向量公式中, 如果是一个列向量, 则在转为矩阵的时候将他们按照axis=1的方向堆积

    • 在向量公式中, 如果是一个行向量, 则在转为矩阵的时候将他们按照axis=0的方向堆积

    全连接神经网络公式

    • 前向传播
    • 反向传播
      • (dA^{[L]}=-({Yover{A^{[L]}}} - {{1 - Y}over{1 - A^{[L]}}})), 进行反向传播初始化, 这个是必须的, 这里是(sigmoid)函数的对(A^{[L]})的梯度
      • 现在假设共2层, 1层hidden layer, 1层output layer
      • (dZ^{[2]}=dA^{[2]}.*g'(Z^{[2]}))
      • (dW^{[2]}={1over m}dZ^{[2]}(A^{[1]})^T)
      • (db^{[2]}={1over m}dZ^{[2]})
      • (dZ^{[1]}=dA^{[1]}.*g'(Z^{[1]}))
      • (dW^{[1]}={1over m}dZ^{[1]}X^T)
      • (db^{[1]}={1over m}dZ^{[1]})

    梯度检测

    • 使用传统的方法, 也就是导数的定义计算出梯度, 与反向传播计算的梯度相减, 如果在阈值内则合法
  • 相关阅读:
    2. Django每日一码 之as_view() 源码
    gdb
    Mex文件在VS2010中调试方法
    intel ipp6.0安装过程
    C++开源库大全
    Win7下搭建Go语言开发环境
    for_each使用方法详解
    使用VS2012编译和使用C++ STL(STLport)
    django css
    google mock C++单元测试框架
  • 原文地址:https://www.cnblogs.com/megachen/p/10606621.html
Copyright © 2011-2022 走看看