話談tensorflow神經網路的啟用函式
神經網路啟用函式有很多,我們來看下:
1、我們常用啟用函式是S型函式,也就是sigmod(x)。S 型函式並非是唯一可以使用的啟用函式,實際上它具有一些不足。
從圖中可以看出,S 型函式的導數最大值為 0.25(如上所示)。這意味著,當你用 S 型函式單元進行反向傳播時,網路上每層出現的錯誤至少減少 75%,如果有很多層,權重更新將很小,這些權重需要很長的訓練時間。因此,S 型函式不適合作為隱藏單元上的啟用函式。(可能會發生梯度消失的現象)
2、ReLU 修正線性單元
近期的大多數深度學習網路都對隱藏層使用修正線性單元 (ReLU),而不是 S 型函式。如果輸入小於 0,修正線性單元的輸出是 0,原始輸出則相反。即如果輸入大於 0,則輸出等於輸入。從數學角度來看,如下所示:
函式的輸出是輸入值
或
(取較大者)。圖表如下所示:
當輸入是正數時,導數是 1,所以沒有 S 型函式的反向傳播錯誤導致的消失效果。研究表明,對於大型神經網路來說,ReLU 的訓練速度要快很多。
不足:有時候一個非常大的梯度流過一個 ReLU 神經元,更新過引數之後,會使ReLU神經元始終為 0(這個神經元再也不會對任何資料有啟用現象了)。這些“無效”的神經元將始終為 0,很多計算在訓練中被浪費了。神課:CS231
3、Softmax
函式和
函式類似,都是將輸出壓縮到
。softmax 函式與普通 sigmoid 之間的真正差別是 softmax 會標準化輸出,使輸出之和等於 1。對於這兩種函式,你都可以輸入向量,並獲得輸出為相同大小的向量,但是所有值都壓縮在 0 和 1 之間。sigmoid 可用於只有一個輸出單元的二元分類。但是如果進行多項分類的話,則需要使用多個輸出單元(每個類別一個單元),並對輸出進行 softmax 啟用。,
對輸出做了歸一化處理。
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)