# TensorFlow 如何工作
起初,TensorFlow 中的計算可能看起來不必要地復雜化。但有一個原因:由于 TensorFlow 如何處理計算,開發更復雜的算法相對容易。該秘籍將指導我們完成 TensorFlow 算法的偽代碼。
## 做好準備
目前,TensorFlow 在 Linux,macOS 和 Windows 上受支持。本書的代碼已經在 Linux 系統上創建和運行,但也應該在任何其他系統上運行。該書的代碼可在 GitHub 的 [https://github.com/nfmcclure/tensorflow_cookbook](https://github.com/nfmcclure/tensorflow_cookbook) 以及 Packt 倉庫中找到: [https://github.com/PacktPublishing/TensorFlow-Machine -Learning-Cookbook-Second-Edition](https://github.com/PacktPublishing/TensorFlow-Machine-Learning-Cookbook-Second-Edition) 。
在本書中,我們只關注 TensorFlow 的 Python 庫包裝器,盡管 TensorFlow 的大多數原始核心代碼都是用 C ++編寫的。本書將使用 Python 3.6+( [https://www.python.org](https://www.python.org) )和 TensorFlow 1.10.0+( [https://www.tensorflow.org](https://www.tensorflow.org) )。雖然 TensorFlow 可以在 CPU 上運行,但是如果在 GPU 上處理,大多數算法運行得更快,并且在具有 Nvidia Compute Capability v4.0 +(推薦 v5.1)的顯卡上支持。
TensorFlow 的流行 GPU 是 Nvidia Tesla 架構和具有至少 4 GB 視頻 RAM 的 Pascal 架構。要在 GPU 上運行,您還需要下載并安裝 Nvidia CUDA 工具包以及版本 5.x +( [https://developer.nvidia.com/cuda-downloads](https://developer.nvidia.com/cuda-downloads) )。
本章中的一些秘籍將依賴于當前安裝的 SciPy,NumPy 和 scikit-learn Python 包。這些隨附的軟件包也包含在 Anaconda 軟件包中[ [https://www.continuum.io/downloads](https://www.continuum.io/downloads) )。
## 操作步驟
在這里,我們將介紹 TensorFlow 算法的一般流程。大多數秘籍將遵循以下大綱:
1. 導入或生成數據集:我們所有的機器學習算法都依賴于數據集。在本書中,我們將生成數據或使用外部數據集源。有時,最好依賴生成的數據,因為我們只想知道預期的結果。大多數情況下,我們將訪問給定秘籍的公共數據集。有關訪問這些數據集的詳細信息,請參見本章第 8 節的其他資源。
2. 轉換和正則化數據:通常,輸入數據集不會出現在圖片中。 TensorFlow 期望我們需要轉換 TensorFlow,以便它們獲得可接受的形狀。數據通常不在我們的算法所期望的正確維度或類型中。在我們使用之前,我們必須轉換數據。大多數算法也期望歸一化數據,我們也會在這里看一下。 TensorFlow 具有內置函數,可以為您正則化數據,如下所示:
```py
import tensorflow as tf
data = tf.nn.batch_norm_with_global_normalization(...)
```
1. 將數據集劃分為訓練集,測試集和驗證集:我們通常希望在我們訓練過的不同集上測試我們的算法。此外,許多算法需要超參數調整,因此我們留出一個驗證集來確定最佳的超參數集。
2. 設置算法參數(超參數):我們的算法通常有一組參數,我們在整個過程中保持不變。例如,這可以是我們選擇的迭代次數,學習率或其他固定參數。將這些一起初始化是一種良好的做法,以便讀者或用戶可以輕松找到它們,如下所示:
```py
learning_rate = 0.01
batch_size = 100
iterations = 1000
```
1. 初始化變量和占位符:TensorFlow 依賴于知道它能夠和不能修改的內容。 TensorFlow 將在優化期間修改/調整變量(模型權重/偏差)以最小化損失函數。為此,我們通過占位符提供數據。我們需要初始化變量和占位符的大小和類型,以便 TensorFlow 知道會發生什么。 TensorFlow 還需要知道期望的數據類型。對于本書的大部分內容,我們將使用`float32`。 TensorFlow 還提供`float64`和`float16`。請注意,用于精度的更多字節會導致算法速度變慢,但使用較少會導致精度降低。請參閱以下代碼:
```py
a_var = tf.constant(42)
x_input = tf.placeholder(tf.float32, [None, input_size])
y_input = tf.placeholder(tf.float32, [None, num_classes])
```
1. 定義模型結構:在獲得數據并初始化變量和占位符之后,我們必須定義模型。這是通過構建計算圖來完成的。我們將在[第 2 章](../Text/10.html),TensorFlow 方法中更詳細地討論計算圖 TensorFlow 秘籍中的運算中的計算圖。此示例的模型將是線性模型(`y = mx + b`):
```py
y_pred = tf.add(tf.mul(x_input, weight_matrix), b_matrix)
```
1. 聲明損失函數:定義模型后,我們必須能夠評估輸出。這是我們宣布損失函數的地方。損失函數非常重要,因為它告訴我們預測距實際值有多遠。在[第 2 章](../Text/10.html),TensorFlow 方法中的實現反向傳播秘籍中更詳細地探討了不同類型的損失函數。在這里,我們實現了 n 點的均方誤差,即:

```py
loss = tf.reduce_mean(tf.square(y_actual - y_pred))
```
1. 初始化和訓練模型:現在我們已經完成了所有工作,我們需要創建圖實例,通過占位符輸入數據,讓 TensorFlow 更改變量以更好地預測我們的訓練數據。這是初始化計算圖的一種方法:
```py
with tf.Session(graph=graph) as session:
...
session.run(...)
...
Note that we can also initiate our graph with:
session = tf.Session(graph=graph)
session.run(...)
```
1. 評估模型:一旦我們構建并訓練了模型,我們應該通過查看通過某些指定標準對新數據的處理程度來評估模型。我們對訓練和測試裝置進行評估,這些評估將使我們能夠看到模型是否過擬合。我們將在后面的秘籍中解決這個問題。
2. 調整超參數:大多數情況下,我們希望根據模型的表現返回并更改一些超參數。然后,我們使用不同的超參數重復前面的步驟,并在驗證集上評估模型。
3. 部署/預測新結果:了解如何對新數據和未見數據進行預測也很重要。一旦我們對他們進行了訓練,我們就可以對所有模型進行此操作。
## 工作原理
在 TensorFlow 中,我們必須先設置數據,變量,占位符和模型,然后才能告訴程序訓練和更改變量以改進預測。 TensorFlow 通過計算圖完成此任務。這些計算圖是沒有遞歸的有向圖,這允許計算并行性。為此,我們需要為 TensorFlow 創建一個最小化的損失函數。 TensorFlow 通過修改計算圖中的變量來實現此目的。 TensorFlow 知道如何修改變量,因為它跟蹤模型中的計算并自動計算變量梯度(如何更改每個變量)以最小化損失。因此,我們可以看到進行更改和嘗試不同數據源是多么容易。
## 另見
有關 TensorFlow 的更多介紹和資源,請參閱官方文檔和教程:
* 一個更好的起點是官方 Python API 文檔: [https://www.tensorflow.org/api_docs/python/](https://www.tensorflow.org/api_docs/python/)
* 還有教程:?? [https://www.tensorflow.org/tutorials/](https://www.tensorflow.org/tutorials/)
* TensorFlow 教程,項目,演示文稿和代碼倉庫的非官方集合: [https://github.com/jtoy/awesome-tensorflow](https://github.com/jtoy/awesome-tensorflow)
- 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