话谈tensorflow神经网络的激活函数

版权声明:博客为作者平时学习备忘,参考资料已在文尾列出一并表示感谢。如若转载,请列明出处。 https://blog.csdn.net/woai8339/article/details/83067502

神经网络激活函数有很多,我们来看下:
1、我们常用激活函数是S型函数,也就是sigmod(x)。S 型函数并非是唯一可以使用的激活函数,实际上它具有一些不足。
在这里插入图片描述
       从图中可以看出,S 型函数的导数最大值为 0.25(如上所示)。这意味着,当你用 S 型函数单元进行反向传播时,网络上每层出现的错误至少减少 75%,如果有很多层,权重更新将很小,这些权重需要很长的训练时间。因此,S 型函数不适合作为隐藏单元上的激活函数。(可能会发生梯度消失的现象)
2、ReLU 修正线性单元
       近期的大多数深度学习网络都对隐藏层使用修正线性单元 (ReLU),而不是 S 型函数。如果输入小于 0,修正线性单元的输出是 0,原始输出则相反。即如果输入大于 0,则输出等于输入。从数学角度来看,如下所示: f ( x ) = m a x ( x , 0 ) f(x) = max(x, 0)
函数的输出是输入值 x x 0 0 (取较大者)。图表如下所示:
在这里插入图片描述
当输入是正数时,导数是 1,所以没有 S 型函数的反向传播错误导致的消失效果。研究表明,对于大型神经网络来说,ReLU 的训练速度要快很多。
不足:有时候一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,会使ReLU神经元始终为 0(这个神经元再也不会对任何数据有激活现象了)。这些“无效”的神经元将始终为 0,很多计算在训练中被浪费了。神课:CS231
3、Softmax
        S o f t m a x ( x ) Softmax(x) 函数和 S i g m o d ( x ) Sigmod(x) 函数类似,都是将输出压缩到 [ 0 , 1 ] [0,1] 。softmax 函数与普通 sigmoid 之间的真正差别是 softmax 会标准化输出,使输出之和等于 1。对于这两种函数,你都可以输入向量,并获得输出为相同大小的向量,但是所有值都压缩在 0 和 1 之间。sigmoid 可用于只有一个输出单元的二元分类。但是如果进行多项分类的话,则需要使用多个输出单元(每个类别一个单元),并对输出进行 softmax 激活。, S o f t m a x ( x ) Softmax(x) 对输出做了归一化处理。 S o f t m a x ( x ) j = P ( y = j X = x ) = e x T w j i = 1 K e x T w i Softmax(x)_j = P{(y=j|X=x)} = \frac {e^{x^T*w_j}}{\sum_{i=1}^{K}{e^{x^T*w_i}}}

import tensorflow as tf


def run():
    output = None
    logit_data = [2.0, 1.0, 0.1]
    logits = tf.placeholder(tf.float32)

    # TODO: Calculate the softmax of the logits
    # softmax =
    softmax = tf.nn.softmax(logits)

    with tf.Session() as sess:
        # TODO: Feed in the logit data
        # output = sess.run(softmax,    )
        output = sess.run(softmax, feed_dict={logits:logit_data})

    return output
if __name__ == '__main__':
    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' #防止CPU被鄙视报错
    output = run()
    print (output)

猜你喜欢

转载自blog.csdn.net/woai8339/article/details/83067502
今日推荐