ReLU和Dropout

2020-12-11  本文已影响0人  WILeroy

概述

从解决最小的问题开始。

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
上一篇下一篇

猜你喜欢

热点阅读