【tensorflow2.0】激活函數activation


激活函數在深度學習中扮演着非常重要的角色,它給網絡賦予了非線性,從而使得神經網絡能夠擬合任意復雜的函數。

如果沒有激活函數,無論多復雜的網絡,都等價於單一的線性變換,無法對非線性函數進行擬合。

目前,深度學習中最流行的激活函數為 relu, 但也有些新推出的激活函數,例如 swish、GELU 據稱效果優於relu激活函數。

激活函數的綜述介紹可以參考下面兩篇文章。

《一文概覽深度學習中的激活函數》

https://zhuanlan.zhihu.com/p/98472075

《從ReLU到GELU,一文概覽神經網絡中的激活函數》

https://zhuanlan.zhihu.com/p/98863801

一,常用激活函數

  • tf.nn.sigmoid:將實數壓縮到0到1之間,一般只在二分類的最后輸出層使用。主要缺陷為存在梯度消失問題,計算復雜度高,輸出不以0為中心。

  • tf.nn.softmax:sigmoid的多分類擴展,一般只在多分類問題的最后輸出層使用。

  • tf.nn.tanh:將實數壓縮到-1到1之間,輸出期望為0。主要缺陷為存在梯度消失問題,計算復雜度高。

  • tf.nn.relu:修正線性單元,最流行的激活函數。一般隱藏層使用。主要缺陷是:輸出不以0為中心,輸入小於0時存在梯度消失問題(死亡relu)。

  • tf.nn.leaky_relu:對修正線性單元的改進,解決了死亡relu問題。

  • tf.nn.elu:指數線性單元。對relu的改進,能夠緩解死亡relu問題。

  • tf.nn.selu:擴展型指數線性單元。在權重用tf.keras.initializers.lecun_normal初始化前提下能夠對神經網絡進行自歸一化。不可能出現梯度爆炸或者梯度消失問題。需要和Dropout的變種AlphaDropout一起使用。

  • tf.nn.swish:自門控激活函數。谷歌出品,相關研究指出用swish替代relu將獲得輕微效果提升。

  • gelu:高斯誤差線性單元激活函數。在Transformer中表現最好。tf.nn模塊尚沒有實現該函數。

二,在模型中使用激活函數

在keras模型中使用激活函數一般有兩種方式,一種是作為某些層的activation參數指定,另一種是顯式添加layers.Activation激活層。

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers,models
 
tf.keras.backend.clear_session()
 
model = models.Sequential()
model.add(layers.Dense(32,input_shape = (None,16),activation = tf.nn.relu)) #通過activation參數指定
model.add(layers.Dense(10))
model.add(layers.Activation(tf.nn.softmax))  # 顯式添加layers.Activation激活層
model.summary()
 

 

參考:

開源電子書地址:https://lyhue1991.github.io/eat_tensorflow2_in_30_days/

GitHub 項目地址:https://github.com/lyhue1991/eat_tensorflow2_in_30_days

 


免責聲明!

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



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