美文网首页
ReLU和Dropout

ReLU和Dropout

作者: WILeroy | 来源:发表于2020-12-11 20:10 被阅读0次

    概述

    从解决最小的问题开始。

    1 激活函数

    ReLU家族的激活函数通常是神经网络中激活函数的首选项,其优点在于:

    • 能解决梯度消失的问题
    • 运算简单,速度快

    ReLU

    output = \begin{cases} z, &z=0\\ 0, &z\leq0 \end{cases}

    Leaky ReLU

    output = \begin{cases} z, &z=0\\ 0.01z, &z\leq0 \end{cases}

    2 Dropout

    Dropout是一种有效的防止过拟合的方法,该方法的实质是在一次前向传播过程中,随机地丢弃(使失活)网络中的某些神经元。所谓的丢弃神经元,其实是在数据流过每个神经元时,都额外的乘上一个概率p,p的值为0时,当前神经元即被丢弃。随机丢弃神经元的意义在于使网络不依赖与某一个神经元或某一种神经元组合,因为每次随机丢弃都会使网络产生新的结构。

    Dropout通常用于神经网络的全连接层,因为在卷积层、池化层等部分网络已经是稀疏的,并且具有完备的理论解释(权重共享、感受野等),而全连接层是稠密的,使用Dropout减少参数量能有效地改变其泛化能力。下面是使用tensorflow(v1)的一个简单示例:

    def inference(x, keep_prob=0.5):
        """ cnn前向传播
        """
        x = tf.reshape(x, shape=[-1, 28, 28, 1])
        with tf.variable_scope('conv_1'):
            conv_1 = conv2d(x, [5, 5, 1, 32], [32])
            pool_1 = max_pool(conv_1)
        with tf.variable_scope('conv_2'):
            conv_2 = conv2d(pool_1, [5, 5, 32, 64], [64])
            pool_2 = max_pool(conv_2)
        with tf.variable_scope('fc'):
            pool_2_flat = tf.reshape(pool_2, [-1, 7*7*64])
            fc_1 = fclayer(pool_2_flat, [7*7*64, 1024], [1024])
            fc_1_drop = tf.nn.dropout(fc_1, keep_prob)
        with tf.variable_scope('output'):
            output = fclayer(fc_1_drop, [1024, 10], [10])
        return output
    

    相关文章

      网友评论

          本文标题:ReLU和Dropout

          本文链接:https://www.haomeiwen.com/subject/zalsgktx.html