# 三、使用 TensorBoard 監控網絡訓練
在本章中,我將向您展示如何使用 TensorBoard 幫助更快更輕松地訓練深度神經網絡。 我認為 TensorBoard 是一個很棒的工具,經常被忽略,而它又常常被拖到腳注或上一章中。 現在,讓我們看一下 TensorBoard,以便我們可以立即開始利用它。
我們將在本章介紹以下主題:
* TensorBoard 的簡要概述
* 設置 TensorBoard
* 將 Keras 連接到 TensorBoard
* 使用 TensorBoard
# TensorBoard 的簡要概述
TensorBoard 是一個基于 Web 的應用,可以幫助您可視化 TensorFlow 中創建的深度神經網絡的指標,參數和結構。 它將幫助您更快,更輕松地調試和優化深度神經網絡。
正如您現在可能已經猜到的那樣,深度神經網絡可能變得相當復雜。 不幸的是,這意味著很多事情可能出錯。 眾所周知,我時不時地會犯一個錯誤,而當錯誤發生在一個深度神經網絡內部時,該深度神經網絡位于一個框架內,該框架在另一個框架上運行,在一個 GPU 上運行,很難找到這些錯誤。 他們。 TensorBoard 可能是您需要在其他本來很暗的房間中發現問題的手電筒。 TensorBoard 將允許您在訓練網絡時監視指標和參數的變化,這可以大大加快故障排除速度。
TensorBoard 也非常適合優化。 借助 TensorBoard,您可以直觀地比較多個模型運行。 這使您可以試驗不斷變化的架構和超參數,然后相對于網絡的其他運行評估那些變化。 所有這一切都可能在每個周期發生,因此如果您愿意,您可以取消效果不佳的模型運行,從而節省了時間和金錢。 您可以在[這個頁面](https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard)上閱讀有關 TensorBoard 的更多信息。
# 設置 TensorBoard
TensorBoard 是一個獨立的 Web 應用。 您將通過網絡瀏覽器使用它。 設置需要兩個步驟。 首先,我們將設置 TensorBoard 以可視化在 TensorFlow 和 Keras 中構建的網絡,然后我們將設置 Keras 與 TensorBoard 共享信息。
本節介紹 TensorBoard 的設置。 接下來的內容將涉及修改 Keras 代碼以與 TensorBoard 共享信息。
# 安裝 TensorBoard
如果您已經安裝了 TensorFlow,則您的機器上可能已經安裝了 Tensorboard。 萬一您可以安裝和更新 TensorBoard,可以使用`pip`進行安裝,就像 Keras 和 TensorFlow 一樣。 要安裝它,只需運行以下命令:
```py
pip install -U tensorboard
```
# TensorBoard 如何與 Keras/TensorFlow 交互
TensorBoard 和 TensorFlow 使用公共日志目錄共享信息。 在 Keras 和 TensorFlow 訓練中,Keras 將指標和激活直方圖(稍后將對此進行詳細介紹)寫入您指定的日志目錄中。 現在,讓我們使用以下代碼在主目錄中為該示例創建一個日志目錄:
```py
mkdir ~/ch3_tb_log
```
# 運行 TensorBoard
剩下的就是啟動 TensorBoard 進程。 我們可以使用以下代碼啟動 TensorBoard:
```py
tensorboard --logdir ~/ch3_tb_log --port 6006
```
您可能已經猜到了,`--logdir`指定我們剛剛創建的目錄,`--port 6006`指定 TensorBoard 將在其上運行的端口。 端口`6006`是默認端口。 但是,您可以使用所需的任何端口。
現在,您應該可以通過將瀏覽器指向`http://<ip address>:6006`來導航到 TensorBoard URL。
如果使用的是云服務,則可能還需要調整防火墻或安全規則,以允許通過端口`6006`連接到服務器。 在 Amazon Web Services(AWS)上,您可以通過編輯與您的 EC2 實例關聯的安全組中的入站規則來執行此操作:

您可能不希望像我上面那樣允許全世界范圍內的開放訪問。 這只是一個測試實例,因此我不太關心安全性,無論如何我都喜歡過著危險的生活。
如果一切正常,您應該看到一個空的 TensorBoard,如下所示:

不用擔心,我們很快就會填滿。
# 將 Keras 連接到 TensorBoard
現在 TensorBoard 已啟動并正在運行,剩下的就是告訴 Keras 將 TensorBoard 日志寫入我們上面指定的目錄。 幸運的是,這確實很容易實現,它為我們提供了一個很好的機會來了解 Keras 中稱為 **Keras 回調**的特殊函數類。
# 引入 Keras 回調
Keras 中的回調是可以在訓練過程中運行的函數。 他們可以做各種偉大的事情,例如在某個周期之后節省模型權重,記錄事情,更改超參數或方便地編寫 TensorBoard 日志文件。 您甚至可以創建自己的自定義回調。
在下一節中,我們將使用 TensorBoard 回調。 但是,我鼓勵您在[這個頁面](https://keras.io/callbacks)上查看 Keras 中可用的所有回調。
TensorBoard 回調是可以在模型訓練之前進行配置和實例化的對象。 我們將創建這些回調的列表。 一旦創建了要用于深度神經網絡的回調列表,我們就可以將該列表作為參數傳遞給模型的`.fit()`方法。 然后,將在每個周期或 Keras 適當時使用這些回調。 在我們繼續下一個示例時,這將更有意義。
# 創建一個 TensorBoard 回調
在本章中,我通過復制第 2 章“開始使用深度學習來解決回歸問題”的網絡和數據。 我們將做一些簡單的添加來添加 TensorBoard 回調。 讓我們從修改我們首先構建的`mlp`開始。
首先,我們需要使用以下代碼導入 TensorBoard 回調類:
```py
from keras.callbacks import TensorBoard
```
然后,我們將啟動回調。 我喜歡在創建所有回調的函數中執行此操作,以使事情精心制作和整理。 下面的`create_callbacks()`函數將返回我們將傳遞給`.fit()`的所有回調的列表。 在這種情況下,它將返回一個包含一個元素的列表:
```py
def create_callbacks():
tensorboard_callback = TensorBoard(log_dir='~/ch3_tb_log/mlp',
histogram_freq=1, batch_size=32, write_graph=True,
write_grads=False)
return [tensorboard_callback]
```
在繼續之前,我們先介紹一下這里使用的一些參數:
* `log_dir` **:**這是我們將為 TensorBoard 寫入日志文件的路徑。
您可能已經注意到,我正在將 MLP 網絡的 TensorBoard 回調的日志寫入`~/ch_3_tb_log/mlp`,這將在我們為 TensorBoard 指定的目錄下創建一個新的目錄`mlp`。 這是故意的。 我們將配置在第 2 章,“使用深度學習解決回歸問題”訓練的深度神經網絡模型,以登錄到單獨的目錄`~/ch_3_tb_log/dnn`。 這樣做將使我們能夠比較兩個模型的運行。
* `histogram_freq`:這指定我們將多長時間計算一次激活和權重的直方圖(以周期為單位)。 它的默認值為 0,這會使日志更小,但不會生成直方圖。 我們將介紹為什么以及何時您會對直方圖感興趣。
* `batch_size`:這是用于計算直方圖的批量大小。 默認為 32。
* `write_graph`:此函數為布爾值。 這將告訴 TensorBoard 可視化網絡圖。 這可能非常方便,但也會使日志變得很大。
* `write_grads`:此函數也是布爾值。 這將告訴 TensorBoard 也計算梯度的直方圖。
由于 TensorFlow 會自動為您計算梯度,因此很少使用。 但是,如果您要使用自定義激活或費用,它可能是出色的故障排除工具。
TensorBoard 回調可以接受用于在圖像上運行神經網絡或通過使用嵌入式層的其他參數。 我們將在本書的后面介紹這兩個方面。 如果您對這些函數感興趣,請訪問 [TensorBoard API 文檔](https://keras.io/callbacks/#tensorboard)。
現在,我們只需要創建回調列表,并將`mlp`與`callbacks`參數匹配即可。 看起來像這樣:
```py
callbacks = create_callbacks()
model.fit(x=data["train_X"], y=data["train_y"], batch_size=32,
epochs=200, verbose=1, validation_data=(data["val_X"],
data["val_y"]), callbacks=callbacks)
```
為了清楚起見,我將新參數加粗了。
在繼續使用 TensorBoard 之前,我將以與檢測`mlp`相同的方式來檢測深度神經網絡。 唯一的代碼更改是我們將 TensorBoard 日志寫入的目錄。 下面給出了實現該方法的方法,供您參考:
```py
def create_callbacks():
tensorboard_callback = TensorBoard(log_dir='./ch3_tb_log/dnn',
histogram_freq=1, batch_size=32, write_graph=True, write_grads=False)
return [tensorboard_callback]
```
其余代碼將相同。 現在,讓我們再次訓練每個網絡,看看 TensorBoard。
# 使用 TensorBoard
現在我們已經完全配置了 TensorBoard 并告訴我們的網絡如何向其發送日志數據,我們可以開始利用它了。 在本章的其余部分,我將向您展示一些我最喜歡的使用 TensorBoard 的方式。 TensorBoard 的功能不只此而已,我們將在本書的其余部分中重新討論其他功能。
# 可視化訓練
由于我們已在第 2 章“使用了深度學習解決回歸問題”中使用這兩種模型編寫了日志數據,因此可以使用 TensorBoard 以圖形方式比較這兩種模型。 打開 TensorBoard 并轉到`SCALARS`選項卡。 您應該會看到類似這樣的內容。 您可能需要單擊`loss`和`val_loss`來展開圖形:

張量板顯示模型的損失圖和`val_loss`圖
如果您查看屏幕的左下角,則應注意,我們創建的每個目錄都有與之關聯的運行。 兩者均處于選中狀態。 這意味著在我們的圖形上,我們將看到兩個模型的輸出。
TensorBoard 可以容納許多運行,并且您可以通過正則表達式過濾它們(例如`^dnn`將顯示所有以`dnn`開頭的運行)。 這意味著,如果您通過許多實驗或運行(例如超參數優化)來搜索*最佳*模型,則可以在明確并一致地命名運行,并包含有意義的超參數和架構信息的情況下,以這個名字快速瀏覽它們!
這些圖上的默認 **X** 比例尺是**周期**。 **Y** 值是我們選擇的**損失函數**,即 **MAE**。 您可以單擊圖形以瀏覽它們并拖動以縮放。
看到這樣的圖,我們真的可以看到每個網絡的相對偏差和方差。 雖然模型之間在訓練損失方面有很好的分離,但深度神經網絡在驗證集上只得到了一點點改善,這表明我們已經進入了過擬合的領域。
# 可視化網絡圖
雖然能夠查看我們的訓練過程并比較模型顯然很不錯,但這并不是 TensorBoard 所能做的。 我們還可以使用它來可視化網絡結構。 在這里,我導航到`GRAPHS`并提出了深度神經網絡的結構:

TensorBoard 顯示深度神經網絡的結構
訓練節點代表輸入張量,默認情況下,正是這個巨型章魚以某種無益的方式連接到圖的其余部分。 要解決此問題,您只需單擊該節點,然后單擊從主圖中刪除。 然后將其移到側面。
# 可視化損壞的網絡
TensorBoard 是一個出色的故障排除工具。 為了證明這一點,我將復制我們的深度神經網絡并將其破壞! 幸運的是,打破神經網絡真的很容易。 相信我,我已經無意間做了這件事,以至于我現在基本上是專家。
想象一下,您剛剛訓練了一個新的神經網絡,并且看到損失看起來像這樣:

該網絡的損失函數被卡住,并且比我們之前的運行要高得多。 什么地方出了錯?
導航到 TensorBoard 的`HISTOGRAMS`部分,并可視化第一個隱藏層。 讓我們比較兩個網絡中隱藏層 1 的權重直方圖:

顯示兩個網絡中隱藏層 1 的權重直方圖的屏幕截圖
對于標記為 dnn 的網絡的偏差和權重,您將看到權重分布在整個圖中。 您甚至可以說每個分布都可能是正態分布。
您也可以在“分布”部分比較權重和偏差。 兩者都以略有不同的方式呈現大多數相同的信息。
現在,看看我們破碎的網絡的權重和偏置。 并不是*這樣分散*,實際上的權重基本上是相同的。 網絡并不是真正的學習。 該層中的每個神經元看起來或多或少都是相同的。 如果您查看其他隱藏層,則會看到更多相同的層。
您可能想知道我是怎么做到的。 您很幸運,我會分享我的秘密。 畢竟,您永遠都不知道何時需要斷開自己的網絡。 為了解決問題,我將網絡中的每個神經元初始化為完全相同的值。 發生這種情況時,每個神經元在反向傳播期間收到的誤差是完全相同的,并且更改的方式也完全相同。 網絡然后無法破壞對稱性。 以隨機方式將權重初始化到深度神經網絡非常重要,如果您違反了該規則,就會發生這種情況!
遇到問題時,可以像這樣完全使用 TensorBoard。 請記住,我們的深度神經網絡有 4033,在深度學習領域中,它仍然可以算作*很小的*。 使用 TensorBoard,我們能夠直觀地檢查 4033 個參數并確定問題。 TensorBoard 是一個用于深度學習的暗室中的神奇手電筒。
# 總結
在本章中,我們討論了如何安裝,配置和使用 TensorBoard。 我們討論了如何使用 TensorBoard 在 TensorBoard 的`SCALARS`部分中的每個周期檢查模型的損失函數,從而直觀地比較模型。 然后,我們使用 TensorsBoard 的`GRAPHS`部分來可視化網絡結構。 最后,我們通過查看直方圖向您展示了如何使用 TensorBoard 進行故障排除。
在下一章中,我們將研究如何使用 Keras 和 TensorFlow 解決二分類問題,從而擴展我們的深度學習技巧。
- 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
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻