1. 程式人生 > >話談tensorflow神經網路的啟用函式

話談tensorflow神經網路的啟用函式

神經網路啟用函式有很多,我們來看下:
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)