Tensorflow ActiveFunction激活函數解析


Active Function 激活函數

原創文章,請勿轉載哦~!!

覺得有用的話,歡迎一起討論相互學習~


我的微博我的github我的B站

  • Tensorflow提供了多種激活函數,在CNN中,人們主要是用tf.nn.relu,是因為它雖然會帶來一些信息損失,但是性能較為突出.開始設計模型時,推薦使用tf.nn.relu,但高級用戶也可創建自己的激活函數.評價某個激活函數是否有用時,需要考慮的因素有:
  1. 該函數應是單調的, 這樣輸出便會隨着輸入的增長而增長,從而使利用梯度下降法尋找局部極值點成為可能.

  2. 該函數應是可微分的,以保證該函數定義域內的任意一點上導數都存在,從而使得梯度下降法能夠正常使用來自這類激活函數的輸出.

在這里插入圖片描述


tf.nn.relu

tf.nn.relu(features, name = None)

  • 解釋:這個函數的作用是計算激活函數relu,即max(features, 0)。
    所有負數都會歸一化為0,所以的正值保留為原值不變

  • 優點在於不收"梯度消失"的影響,且取值范圍在[0,+oo]

  • 缺點在於使用了較大的學習速率時,易受達到飽和的神經元的影響

使用例子

import tensorflow as tf

a = tf.constant([-1.0, 2.0])
with tf.Session() as sess:
    b = tf.nn.relu(a)
    print(sess.run(b))
    # [0.  2.]

輸入參數:
● features: 一個Tensor。數據類型必須是:float32,float64,int32,int64,uint8,int16,int8。
● name: (可選)為這個操作取一個名字。

輸出參數:
● 一個Tensor,數據類型和features相同。


tf.sigmoid

tf.sigmoid(x, name = None)

  • 解釋:這個函數的作用是計算 x 的 sigmoid 函數。具體計算公式為 \(y = 1 / (1 + exp(-x))\)

  • 函數的返回值位於區間[0.0 , 1.0]中,當輸入值較大時,tf.sigmoid將返回一個接近於1.0的值,而當輸入值較小時,返回值將接近於0.0.

  • 優點在於對在真實輸出位於[0.0,1.0]的樣本上訓練的神經網絡,sigmoid函數可將輸出保持在[0.0,1.0]內的能力非常有用.

  • 缺點在於當輸出接近於飽和或者劇烈變化是,對輸出返回的這種縮減會帶來一些不利影響.

  • 當輸入為0時,sigmoid函數的輸出為0.5,即sigmoid函數值域的中間點

使用例子

import tensorflow as tf

a = tf.constant([[-1.0, -2.0], [1.0, 2.0], [0.0, 0.0]])
sess = tf.Session()
print(sess.run(tf.sigmoid(a)))

# [[ 0.26894143  0.11920292]
#  [ 0.7310586   0.88079703]
#  [ 0.5         0.5       ]]

輸入參數:
● x: 一個Tensor。數據類型必須是float,double,int32,complex64,int64或者qint32。
● name: (可選)為這個操作取一個名字。

輸出參數:
● 一個Tensor,如果 x.dtype != qint32 ,那么返回的數據類型和x相同,否則返回的數據類型是 quint8


tf.tanh

tf.tanh(x, name = None)

  • 解釋:這個函數的作用是計算 x 的 tanh 函數。具體計算公式為\(( exp(x) - exp(-x) ) / ( exp(x) + exp(-x) )\)

  • tanh和tf.sigmoid非常接近,且與后者具有類似的優缺點,tf.sigmoid和tf.tanh的主要區別在於后者的值為[-1.0,1.0]

  • 優點在於在一些特定的網絡架構中,能夠輸出負值的能力十分有用.

  • 缺點在於注意tf.tanh值域的中間點為0.0,當網絡中的下一層期待輸入為負值或者為0.0時,這將引發一系列問題.

使用例子

import tensorflow as tf

a = tf.constant([[-1.0, -2.0], [1.0, 2.0], [0.0, 0.0]])
sess = tf.Session()
print(sess.run(tf.tanh(a)))
# [[-0.76159418 -0.96402758]
#  [ 0.76159418  0.96402758]
#  [ 0.          0.        ]]

輸入參數:
● x: 一個Tensor。數據類型必須是float,double,int32,complex64,int64或者qint32。
● name: (可選)為這個操作取一個名字。

輸出參數:
● 一個Tensor,如果 x.dtype != qint32 ,那么返回的數據類型和x相同,否則返回的數據類型是 quint8 .


tf.nn.dropout

tf.nn.dropout(x, keep_prob, noise_shape = None, seed = None, name = None)

  • 解釋:這個函數雖然不是激活函數,其作用是計算神經網絡層的dropout。一個神經元將以概率keep_prob決定是否放電,如果不放電,那么該神經元的輸出將是0,如果該神經元放電,那么該神經元的輸出值將被放大到原來的1/keep_prob倍。這里的放大操作是為了保持神經元輸出總個數不變。比如,神經元的值為[1, 2],keep_prob的值是0.5,並且是第一個神經元是放電的,第二個神經元不放電,那么神經元輸出的結果是[2, 0],也就是相當於,第一個神經元被當做了1/keep_prob個輸出,即2個。這樣保證了總和2個神經元保持不變。

  • 默認情況下,每個神經元是否放電是相互獨立的。但是,如果noise_shape被修改了,那么他對於變量x就是一個廣播形式,而且當且僅當 noise_shape[i] == shape(x)[i] ,x中的元素是相互獨立的。比如,如果 shape(x) = [k, l, m, n], noise_shape = [k, 1, 1, n] ,那么每個批和通道都是相互獨立的,但是每行和每列的數據都是關聯的,即要不都為0,要不都還是原來的值。一榮俱榮,一損俱損.

使用例子

import tensorflow as tf
# tf.nn.dropout(x, keep_prob, noise_shape = None, seed = None, name = None)
a = tf.constant([[-1.0, 2.0, 3.0, 4.0]])
with tf.Session() as sess:
    b = tf.nn.dropout(a, 0.5, noise_shape=[1, 4])  # 第0維相互獨立,第1維相互獨立
    print(sess.run(b))
    b = tf.nn.dropout(a, 0.5, noise_shape=[1, 1])  # 第0維相互獨立,第1維不是相互獨立的
    print(sess.run(b))
    # 第一次
    # [[-0.  4.  0.  0.]]
    # [[-2.  4.  6.  8.]]
    # 第二次
    # [[-2.  0.  6.  8.]]
    # [[-0.  0.  0.  0.]]

輸入參數:
● x: 一個Tensor。
● keep_prob: 一個 Python 的 float 類型。表示元素是否放電的概率。
● noise_shape: 一個一維的Tensor,數據類型是int32。代表元素是否獨立的標志。
● seed: 一個Python的整數類型。設置隨機種子。
● name: (可選)為這個操作取一個名字。

輸出參數:
● 一個Tensor,數據維度和x相同。

異常:
● 輸入異常: 如果 keep_prob 不是在(0, 1]區間,那么會提示錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM