# 十八、調試 TensorFlow 模型
正如我們在本書中所學到的,TensorFlow 程序用于構建和訓練可用于各種任務預測的模型。在訓練模型時,您可以構建計算圖,運行圖以進行訓練,并評估圖以進行預測。重復這些任務,直到您對模型的質量感到滿意為止,然后將圖與學習的參數一起保存。在生產中,圖是從文件構建或恢復的,并使用參數填充。
構建深度學習模型是一項復雜的技術,TensorFlow API 及其生態系統同樣復雜。當我們在 TensorFlow 中構建和訓練模型時,有時我們會得到不同類型的錯誤,或者模型不能按預期工作。例如,您經常看到自己陷入以下一種或多種情況:
* 在損失和指標輸出中得到了 NaN
* 即使經過多次迭代,損失或其他指標也沒有改善
在這種情況下,我們需要調試使用 TensorFlow API 編寫的代碼。
要修復代碼以使其正常工作,可以使用調試器或平臺提供的其他方法和工具,例如 Python 中的 Python 調試器(`pdb`)和 Linux OS 中的 GNU 調試器(`gdb`)。當出現問題時,TensorFlow API 還提供一些額外的支持來修復代碼。
在本章中,我們將學習 TensorFlow 中可用的其他工具和技術,以幫助調試:
* 使用`tf.Session.run()`獲取張量值
* 使用`tf.Print()`打印張量值
* 用`tf.Assert()`斷言條件
* 使用 TensorFlow 調試器進行調試(`tfdbg`)
# 使用`tf.Session.run()`獲取張量值
您可以使用`tf.Session.run()`獲取要打印的張量值。這些值作為 NumPy 數組返回,可以使用 Python 語句打印或記錄。這是最簡單和最簡單的方法,最大的缺點是計算圖執行所有相關路徑,從獲取的張量開始,如果這些路徑包括訓練操作,那么它前進一步或一個周期。
因此,大多數情況下你不會調用`tf.Session.run()`來獲取圖中間的張量,但你會執行整個圖并獲取所有張量,你需要調試的那些張量以及你不需要的張量調試。
函數`tf.Session.partial_run()`也適用于您可能想要執行圖的一部分的情況,但它是一個高度實驗性的 API,尚未準備好用于生產。
# 使用`tf.Print()`打印張量值
為調試目的打印值的另一個選項是使用`tf.Print()`。當執行包含`tf.Print()`節點的路徑時,您可以在`tf.Print()`中包含張量以在標準錯誤控制臺中打印其值。`tf.Print()`函數具有以下簽名:
```py
tf.Print(
input_,
data,
message=None,
first_n=None,
summarize=None,
name=None
)
```
該函數的參數如下:
* `input_`是一個從函數返回的張量,沒有任何操作
* `data`是要打印的張量列表
* `message`是一個字符串,它作為打印輸出的前綴打印出來
* `first_n`表示打印輸出的步驟數;如果此值為負,則只要執行路徑,就始終打印該值
* `summarize`表示從張量打印的元素數量;默認情況下,僅打印三個元素
您可以按照 Jupyter 筆記本中的代碼`ch-18_TensorFlow_Debugging`。
讓我們修改之前創建的 MNIST MLP 模型來添加`print`語句:
```py
model = tf.Print(input_=model,
data=[tf.argmax(model,1)],
message='y_hat=',
summarize=10,
first_n=5
)
```
當我們運行代碼時,我們在 Jupyter 的控制臺中獲得以下內容:
```py
I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[0 0 0 7 0 0 0 0 0 0...]
I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[0 7 7 1 8 7 2 7 7 0...]
I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[4 8 0 6 1 8 1 0 7 0...]
I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[0 0 1 0 0 0 0 5 7 5...]
I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[9 2 2 8 8 6 6 1 7 7...]
```
使用`tf.Print()`的唯一缺點是該函數提供了有限的格式化功能。
# `tf.Assert()`
調試 TensorFlow 模型的另一種方法是插入條件斷言。`tf.Assert()`函數需要一個條件,如果條件為假,則打印給定張量的列表并拋出`tf.errors.InvalidArgumentError`。
1. `tf.Assert()`函數具有以下特征:
```py
tf.Assert(
condition,
data,
summarize=None,
name=None
)
```
1. 斷言操作不會像`tf.Print()`函數那樣落入圖的路徑中。為了確保`tf.Assert()`操作得到執行,我們需要將它添加到依賴項中。例如,讓我們定義一個斷言來檢查所有輸入是否為正:
```py
assert_op = tf.Assert(tf.reduce_all(tf.greater_equal(x,0)),[x])
```
1. 在定義模型時將`assert_op`添加到依賴項,如下所示:
```py
with tf.control_dependencies([assert_op]):
# x is input layer
layer = x
# add hidden layers
for i in range(num_layers):
layer = tf.nn.relu(tf.matmul(layer, w[i]) + b[i])
# add output layer
layer = tf.matmul(layer, w[num_layers]) + b[num_layers]
```
1. 為了測試這段代碼,我們在第 5 周期之后引入了一個雜質,如下:
```py
if epoch > 5:
X_batch = np.copy(X_batch)
X_batch[0,0]=-2
```
1. 代碼運行正常五個周期,然后拋出錯誤:
```py
epoch: 0000 loss = 6.975991
epoch: 0001 loss = 2.246228
epoch: 0002 loss = 1.924571
epoch: 0003 loss = 1.745509
epoch: 0004 loss = 1.616791
epoch: 0005 loss = 1.520804
-----------------------------------------------------------------
InvalidArgumentError Traceback (most recent call last)
...
InvalidArgumentError: assertion failed: [[-2 0 0]...]
...
```
除了`tf.Assert()`函數,它可以采用任何有效的條件表達式,TensorFlow 提供以下斷言操作,檢查特定條件并具有簡單的語法:
* `assert_equal`
* `assert_greater`
* `assert_greater_equal`
* `assert_integer`
* `assert_less`
* `assert_less_equal`
* `assert_negative`
* `assert_none_equal`
* `assert_non_negative`
* `assert_non_positive`
* `assert_positive`
* `assert_proper_iterable`
* `assert_rank`
* `assert_rank_at_least`
* `assert_rank_in`
* `assert_same_float_dtype`
* `assert_scalar`
* `assert_type`
* `assert_variables_initialized`
作為示例,前面提到的示例斷言操作也可以寫成如下:
```py
assert_op = tf.assert_greater_equal(x,0)
```
# 使用 TensorFlow 調試器(`tfdbg`)的調試
TensorFlow 調試器(`tfdbg`)與其他常用調試器(如`pdb`和`gdb`)的工作方式相同。要使用調試器,該過程通常如下:
1. 在代碼中的斷點處設置要中斷的位置并檢查變量
2. 在調試模式下運行代碼
3. 當代碼在斷點處中斷時,檢查它然后繼續下一步
一些調試器還允許您在代碼執行時以交互方式觀察變量,而不僅僅是在斷點處:
1. 為了使用`tfdbg`,首先導入所需的模塊并將會話包裝在調試器包裝器中:
```py
from tensorflow.python import debug as tfd
with tfd.LocalCLIDebugWrapperSession(tf.Session()) as tfs:
```
1. 接下來,將過濾器附加到會話對象。附加過濾器與在其他調試器中設置斷點相同。例如,以下代碼附加`tfdbg.has_inf_or_nan`過濾器,如果任何中間張量具有`nan`或`inf`值,則會中斷:
```py
tfs.add_tensor_filter('has_inf_or_nan_filter', tfd.has_inf_or_nan)
```
1. 現在,當代碼執行`tfs.run()`時,調試器將在控制臺中啟動調試器接口,您可以在其中運行各種調試器命令來監視張量值。
2. 我們提供了在`ch-18_mnist_tfdbg.py`文件中試用`tfdbg`的代碼。當我們用`python3`執行代碼文件時,我們看到`tfdbg`控制臺:
```py
python3 ch-18_mnist_tfdbg.py
```

1. 在`tfdbg>`提示符下輸入命令`run -f has_inf_or_nan`。代碼在第一個周期后中斷,因為我們使用`np.inf`值填充數據:

1. 現在您可以使用`tfdbg`控制臺或可點擊界面來檢查各種張量的值。例如,我們查看其中一個梯度的值:

[您可以在此鏈接中找到有關使用`tfdbg`控制臺和檢查變量的更多信息](https://www.tensorflow.org/programmers_guide/debugger)。
# 總結
在本章中,我們學習了如何在 TensorFlow 中調試用于構建和訓練模型的代碼。我們了解到我們可以使用`tf.Session.run()`將張量作為 NumPy 數組獲取。我們還可以通過在計算圖中添加`tf.Print()`操作來打印張量值。我們還學習了,在使用`tf.Assert()`和其他`tf.assert_*`操作執行期間,某些條件無法保持時如何引發錯誤。我們通過對 TensorFlow 調試器(`tfdbg`)的介紹結束本章,用于設置斷點和觀察張量值,就像我們在 Python 調試器(`pdb`)或 GNU 調試器(`gdb`中調試代碼一樣) )。
本章將我們的旅程帶入一個新的里程碑。我們不希望旅程在此結束,但我們相信旅程剛剛開始,您將進一步擴展和應用本書中獲得的知識和技能。
我們非常期待聽到您的經驗,反饋和建議。
- TensorFlow 1.x 深度學習秘籍
- 零、前言
- 一、TensorFlow 簡介
- 二、回歸
- 三、神經網絡:感知器
- 四、卷積神經網絡
- 五、高級卷積神經網絡
- 六、循環神經網絡
- 七、無監督學習
- 八、自編碼器
- 九、強化學習
- 十、移動計算
- 十一、生成模型和 CapsNet
- 十二、分布式 TensorFlow 和云深度學習
- 十三、AutoML 和學習如何學習(元學習)
- 十四、TensorFlow 處理單元
- 使用 TensorFlow 構建機器學習項目中文版
- 一、探索和轉換數據
- 二、聚類
- 三、線性回歸
- 四、邏輯回歸
- 五、簡單的前饋神經網絡
- 六、卷積神經網絡
- 七、循環神經網絡和 LSTM
- 八、深度神經網絡
- 九、大規模運行模型 -- GPU 和服務
- 十、庫安裝和其他提示
- TensorFlow 深度學習中文第二版
- 一、人工神經網絡
- 二、TensorFlow v1.6 的新功能是什么?
- 三、實現前饋神經網絡
- 四、CNN 實戰
- 五、使用 TensorFlow 實現自編碼器
- 六、RNN 和梯度消失或爆炸問題
- 七、TensorFlow GPU 配置
- 八、TFLearn
- 九、使用協同過濾的電影推薦
- 十、OpenAI Gym
- TensorFlow 深度學習實戰指南中文版
- 一、入門
- 二、深度神經網絡
- 三、卷積神經網絡
- 四、循環神經網絡介紹
- 五、總結
- 精通 TensorFlow 1.x
- 一、TensorFlow 101
- 二、TensorFlow 的高級庫
- 三、Keras 101
- 四、TensorFlow 中的經典機器學習
- 五、TensorFlow 和 Keras 中的神經網絡和 MLP
- 六、TensorFlow 和 Keras 中的 RNN
- 七、TensorFlow 和 Keras 中的用于時間序列數據的 RNN
- 八、TensorFlow 和 Keras 中的用于文本數據的 RNN
- 九、TensorFlow 和 Keras 中的 CNN
- 十、TensorFlow 和 Keras 中的自編碼器
- 十一、TF 服務:生產中的 TensorFlow 模型
- 十二、遷移學習和預訓練模型
- 十三、深度強化學習
- 十四、生成對抗網絡
- 十五、TensorFlow 集群的分布式模型
- 十六、移動和嵌入式平臺上的 TensorFlow 模型
- 十七、R 中的 TensorFlow 和 Keras
- 十八、調試 TensorFlow 模型
- 十九、張量處理單元
- TensorFlow 機器學習秘籍中文第二版
- 一、TensorFlow 入門
- 二、TensorFlow 的方式
- 三、線性回歸
- 四、支持向量機
- 五、最近鄰方法
- 六、神經網絡
- 七、自然語言處理
- 八、卷積神經網絡
- 九、循環神經網絡
- 十、將 TensorFlow 投入生產
- 十一、更多 TensorFlow
- 與 TensorFlow 的初次接觸
- 前言
- 1.?TensorFlow 基礎知識
- 2. TensorFlow 中的線性回歸
- 3. TensorFlow 中的聚類
- 4. TensorFlow 中的單層神經網絡
- 5. TensorFlow 中的多層神經網絡
- 6. 并行
- 后記
- TensorFlow 學習指南
- 一、基礎
- 二、線性模型
- 三、學習
- 四、分布式
- TensorFlow Rager 教程
- 一、如何使用 TensorFlow Eager 構建簡單的神經網絡
- 二、在 Eager 模式中使用指標
- 三、如何保存和恢復訓練模型
- 四、文本序列到 TFRecords
- 五、如何將原始圖片數據轉換為 TFRecords
- 六、如何使用 TensorFlow Eager 從 TFRecords 批量讀取數據
- 七、使用 TensorFlow Eager 構建用于情感識別的卷積神經網絡(CNN)
- 八、用于 TensorFlow Eager 序列分類的動態循壞神經網絡
- 九、用于 TensorFlow Eager 時間序列回歸的遞歸神經網絡
- TensorFlow 高效編程
- 圖嵌入綜述:問題,技術與應用
- 一、引言
- 三、圖嵌入的問題設定
- 四、圖嵌入技術
- 基于邊重構的優化問題
- 應用
- 基于深度學習的推薦系統:綜述和新視角
- 引言
- 基于深度學習的推薦:最先進的技術
- 基于卷積神經網絡的推薦
- 關于卷積神經網絡我們理解了什么
- 第1章概論
- 第2章多層網絡
- 2.1.4生成對抗網絡
- 2.2.1最近ConvNets演變中的關鍵架構
- 2.2.2走向ConvNet不變性
- 2.3時空卷積網絡
- 第3章了解ConvNets構建塊
- 3.2整改
- 3.3規范化
- 3.4匯集
- 第四章現狀
- 4.2打開問題
- 參考
- 機器學習超級復習筆記
- Python 遷移學習實用指南
- 零、前言
- 一、機器學習基礎
- 二、深度學習基礎
- 三、了解深度學習架構
- 四、遷移學習基礎
- 五、釋放遷移學習的力量
- 六、圖像識別與分類
- 七、文本文件分類
- 八、音頻事件識別與分類
- 九、DeepDream
- 十、自動圖像字幕生成器
- 十一、圖像著色
- 面向計算機視覺的深度學習
- 零、前言
- 一、入門
- 二、圖像分類
- 三、圖像檢索
- 四、對象檢測
- 五、語義分割
- 六、相似性學習
- 七、圖像字幕
- 八、生成模型
- 九、視頻分類
- 十、部署
- 深度學習快速參考
- 零、前言
- 一、深度學習的基礎
- 二、使用深度學習解決回歸問題
- 三、使用 TensorBoard 監控網絡訓練
- 四、使用深度學習解決二分類問題
- 五、使用 Keras 解決多分類問題
- 六、超參數優化
- 七、從頭開始訓練 CNN
- 八、將預訓練的 CNN 用于遷移學習
- 九、從頭開始訓練 RNN
- 十、使用詞嵌入從頭開始訓練 LSTM
- 十一、訓練 Seq2Seq 模型
- 十二、深度強化學習
- 十三、生成對抗網絡
- TensorFlow 2.0 快速入門指南
- 零、前言
- 第 1 部分:TensorFlow 2.00 Alpha 簡介
- 一、TensorFlow 2 簡介
- 二、Keras:TensorFlow 2 的高級 API
- 三、TensorFlow 2 和 ANN 技術
- 第 2 部分:TensorFlow 2.00 Alpha 中的監督和無監督學習
- 四、TensorFlow 2 和監督機器學習
- 五、TensorFlow 2 和無監督學習
- 第 3 部分:TensorFlow 2.00 Alpha 的神經網絡應用
- 六、使用 TensorFlow 2 識別圖像
- 七、TensorFlow 2 和神經風格遷移
- 八、TensorFlow 2 和循環神經網絡
- 九、TensorFlow 估計器和 TensorFlow HUB
- 十、從 tf1.12 轉換為 tf2
- TensorFlow 入門
- 零、前言
- 一、TensorFlow 基本概念
- 二、TensorFlow 數學運算
- 三、機器學習入門
- 四、神經網絡簡介
- 五、深度學習
- 六、TensorFlow GPU 編程和服務
- TensorFlow 卷積神經網絡實用指南
- 零、前言
- 一、TensorFlow 的設置和介紹
- 二、深度學習和卷積神經網絡
- 三、TensorFlow 中的圖像分類
- 四、目標檢測與分割
- 五、VGG,Inception,ResNet 和 MobileNets
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻