# 實現激活函數
激活函數是神經網絡近似非線性輸出并適應非線性特征的關鍵。他們將非線性運算引入神經網絡。如果我們小心選擇了哪些激活函數以及放置它們的位置,它們是非常強大的操作,我們可以告訴 TensorFlow 適合和優化。
## 做好準備
當我們開始使用神經網絡時,我們將定期使用激活函數,因為激活函數是任何神經網絡的重要組成部分。激活函數的目標只是調整權重和偏差。在 TensorFlow 中,激活函數是作用于張量的非線性操作。它們是以與先前的數學運算類似的方式運行的函數。激活函數有很多用途,但主要的概念是它們在對輸出進行歸一化的同時在圖中引入了非線性。使用以下命令啟動 TensorFlow 圖:
```py
import tensorflow as tf
sess = tf.Session()
```
## 操作步驟
激活函數存在于 TensorFlow 中的神經網絡(nn)庫中。除了使用內置激活函數外,我們還可以使用 TensorFlow 操作設計自己的函數。我們可以導入預定義的激活函數(`import tensorflow.nn as nn`)或顯式,并在函數調用中寫入`nn`。在這里,我們選擇明確每個函數調用:
1. 被整流的線性單元,稱為 ReLU,是將非線性引入神經網絡的最常見和最基本的方式。這個函數叫做`max(0,x)`。它是連續的,但不是平滑的。它看起來如下:
```py
print(sess.run(tf.nn.relu([-3., 3., 10.])))
[ 0\. 3\. 10.]
```
1. 有時我們會想要限制前面的 ReLU 激活函數的線性增加部分。我們可以通過將`max(0,x)`函數嵌套到`min()`函數中來實現。 TensorFlow 具有的實現稱為 ReLU6 函數。這被定義為`min(max(0,x),6)`。這是硬 sigmoid 函數的一個版本,并且計算速度更快,并且不會消失(無窮小接近零)或爆炸值。當我們在[第 8 章](../Text/61.html) [](../Text/61.html),卷積神經網絡和[第 9 章](../Text/68.html),循環神經網絡中討論更深層的神經網絡時,這將派上用場。它看起來如下:
```py
print(sess.run(tf.nn.relu6([-3., 3., 10.])))
[ 0\. 3\. 6.]
```
1. S 形函數是最常見的連續和平滑激活函數。它也被稱為邏輯函數,其形式為`1 / (1 + exp(-x))`。 Sigmoid 函數不經常使用,因為它傾向于在訓練期間將反向傳播術語置零。它看起來如下:
```py
print(sess.run(tf.nn.sigmoid([-1., 0., 1.])))
[ 0.26894143 0.5 0.7310586 ]
```
> 我們應該知道一些激活函數不是以零為中心的,例如 sigmoid。這將要求我們在大多數計算圖算法中使用之前將數據歸零。
1. 另一個平滑激活函數是超切線。超正切函數與 sigmoid 非常相似,除了它的范圍在 0 和 1 之間,它的范圍在-1 和 1 之間。該函數具有雙曲正弦與雙曲余弦的比率的形式。寫這個的另一種方法是`(exp(x) - exp(-x)) / (exp(x) + exp(-x))`。此激活函數如下:
```py
print(sess.run(tf.nn.tanh([-1., 0., 1.])))
[-0.76159418 0\. 0.76159418 ]
```
1. `softsign`函數也可用作激活函數。該函數的形式是`x / (|x| + 1)`。 `softsign`函數應該是符號函數的連續(但不是平滑)近似。請參閱以下代碼:
```py
print(sess.run(tf.nn.softsign([-1., 0., -1.])))
[-0.5 0\. 0.5]
```
1. 另一個函數是`softplus`函數,是 ReLU 函數的流暢版本。該函數的形式是`log(exp(x) + 1)`。它看起來如下:
```py
print(sess.run(tf.nn.softplus([-1., 0., -1.])))
[ 0.31326166 0.69314718 1.31326163]
```
> 當輸入增加時,`softplus`函數變為無窮大,而`softsign`函數變為 1.然而,當輸入變小時,`softplus`函數接近零,`softsign`函數變為-1。
1. 指數線性單元(ELU)與 softplus 函數非常相似,只是底部漸近線為-1 而不是 0.如果`x < 0`其他`x`,則形式為`exp(x) + 1`。它看起來如下:
```py
print(sess.run(tf.nn.elu([-1., 0., -1.])))
[-0.63212055 0\. 1\. ]
```
## 工作原理
這些激活函數是我們將來可以在神經網絡或其他計算圖中引入非線性的方法。重要的是要注意我們的網絡中我們使用激活函數的位置。如果激活函數的范圍在 0 和 1(sigmoid)之間,則計算圖只能輸出 0 到 1 之間的值。如果激活函數在內部并隱藏在節點之間,那么我們想要知道當我們傳遞它們時,范圍可以在我們的張量上。如果我們的張量被縮放到平均值為零,我們將希望使用一個激活函數來保持盡可能多的方差在零附近。這意味著我們想要選擇激活函數,例如雙曲正切(tanh)或 softsign。如果張量都被縮放為正數,那么我們理想地選擇一個激活函數來保留正域中的方差。
## 更多
以下是兩個繪圖,說明了不同的激活函數。下圖顯示了 ReLU,ReLU6,softplus,指數 LU,sigmoid,softsign 和雙曲正切函數:

圖 3:softplus,ReLU,ReLU6 和指數 LU 的激活函數
在這里,我們可以看到四個激活函數:softplus,ReLU,ReLU6 和指數 LU。這些函數在零的左邊展平并線性增加到零的右邊,但 ReLU6 除外,其最大值為 6:

圖 4:Sigmoid,雙曲正切(tanh)和 softsign 激活函數
這是 sigmoid,雙曲正切(tanh)和 softsign 激活函數。這些激活函數都是平滑的,具有`S n`形狀。請注意,這些函數有兩個水平漸近線。
- TensorFlow 入門
- 介紹
- TensorFlow 如何工作
- 聲明變量和張量
- 使用占位符和變量
- 使用矩陣
- 聲明操作符
- 實現激活函數
- 使用數據源
- 其他資源
- TensorFlow 的方式
- 介紹
- 計算圖中的操作
- 對嵌套操作分層
- 使用多個層
- 實現損失函數
- 實現反向傳播
- 使用批量和隨機訓練
- 把所有東西結合在一起
- 評估模型
- 線性回歸
- 介紹
- 使用矩陣逆方法
- 實現分解方法
- 學習 TensorFlow 線性回歸方法
- 理解線性回歸中的損失函數
- 實現 deming 回歸
- 實現套索和嶺回歸
- 實現彈性網絡回歸
- 實現邏輯回歸
- 支持向量機
- 介紹
- 使用線性 SVM
- 簡化為線性回歸
- 在 TensorFlow 中使用內核
- 實現非線性 SVM
- 實現多類 SVM
- 最近鄰方法
- 介紹
- 使用最近鄰
- 使用基于文本的距離
- 使用混合距離函數的計算
- 使用地址匹配的示例
- 使用最近鄰進行圖像識別
- 神經網絡
- 介紹
- 實現操作門
- 使用門和激活函數
- 實現單層神經網絡
- 實現不同的層
- 使用多層神經網絡
- 改進線性模型的預測
- 學習玩井字棋
- 自然語言處理
- 介紹
- 使用詞袋嵌入
- 實現 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 進行預測
- 使用 doc2vec 進行情緒分析
- 卷積神經網絡
- 介紹
- 實現簡單的 CNN
- 實現先進的 CNN
- 重新訓練現有的 CNN 模型
- 應用 StyleNet 和 NeuralStyle 項目
- 實現 DeepDream
- 循環神經網絡
- 介紹
- 為垃圾郵件預測實現 RNN
- 實現 LSTM 模型
- 堆疊多個 LSTM 層
- 創建序列到序列模型
- 訓練 Siamese RNN 相似性度量
- 將 TensorFlow 投入生產
- 介紹
- 實現單元測試
- 使用多個執行程序
- 并行化 TensorFlow
- 將 TensorFlow 投入生產
- 生產環境 TensorFlow 的一個例子
- 使用 TensorFlow 服務
- 更多 TensorFlow
- 介紹
- 可視化 TensorBoard 中的圖
- 使用遺傳算法
- 使用 k 均值聚類
- 求解常微分方程組
- 使用隨機森林
- 使用 TensorFlow 和 Keras