前言
TensorBoard是一個機器學習的可視化工具,能夠有效地展示Tensorflow在運行過程中的計算圖、各種指標隨著時間的變化趨勢以及訓練中使用到的數(shù)據(jù)信息。
通過使用TensorBoard,可以將訓練過程中評價指標與訓練次數(shù)繪制成折線圖,從而觀察諸如準確率提高的過程或損失下降的過程。同時,當我們更改模型的超參數(shù)(LearningRate等)時,TensorBoard還可以將不同的超參數(shù)對應的折線圖分類,可以更加直觀地觀察超參數(shù)的選取對模型訓練的影響。
準備代碼
我們上一講成果地編寫了一個卷積網(wǎng)絡的程序,這節(jié)課則需要用到這個程序。從Jupyter Notebook中導出為Python文件的方法很簡單。點擊左上角的File->Download As->Python即可。

由于在運行GPU的TensorFlow程序的時候,無論模型的規(guī)模,Tensorflow程序總是傾向于占用全部的顯存VRAM。因此最好在程序運行之前,通過
gpu_options來指定程序占用的顯存的比例。
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.33)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
這里指定的顯存占用比例為0.33,也就是說這個Tensorflow的程序最多將會占用全部顯存的1/3,而不是占用全部的顯存。這點,當你在同時訓練多個模型的時候極其有用。
Keras的TensorBoard回調(diào)函數(shù)(Callback)
Keras與TensorBoard的通訊基本上是通過Keras的回調(diào)函數(shù)來實現(xiàn)的。關(guān)于Keras的TensorBoard回調(diào)函數(shù)詳見:
https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/TensorBoard?hl=zh-cn
目前,我們最關(guān)注的一個參數(shù)則是log_dir。log_dir指明了log文件希望保存的位置。
程序調(diào)用TensorBoard則需要引入相應的包:
from tensorflow.keras.callbacks import TensorBoard
當使用TensorBoard來可視化訓練過程的時候,給每個模型起一個名字會是十分聰明的做法(因為TensorBoard會將很多模型可視化出來,起名字可以區(qū)分不同的模型)。
給模型起名字的方法有很多,為了確保每個模型都是獨一無二的,因此我們在每個模型的名字后面加上時間作為后綴(用到time包)。
model_name = "kaggle_cat_dog-cnn-64x2-{}".format(int(time.time()))
上述命名的方法是"模型的名字-卷積核的大小-時間",當然,你也可以選擇自己的命名方法,只要夠直觀、簡潔、便于理解就可以。
緊接著在程序里面,通過以下的代碼指明log_dir參數(shù):
tensorboard = TensorBoard(log_dir='logs/{}'.format(model_name))
這樣一來,不同的模型則會擁有不同的log文件夾。
最后,在調(diào)用Keras的model.fit方法中,指明TensorBoard的回調(diào)函數(shù)。注意,同一個模型可以有很多個回調(diào)函數(shù),因此callbacks應該是一個列表。
model.fit(X, y, batch_size =32, epochs=10, validation_split=0.1, callbacks=[tensorboard])
至此,萬事俱備了。打開控制臺,通過python CNN in keras tutorial.py命令來運行我們的卷及網(wǎng)絡程序吧!
程序運行完畢之后,在python文件的同級文件夾下面會出現(xiàn)一個logs文件夾,文件夾下面會有存放我們剛才訓練的模型的tfevent文件的目錄。

打開TensorBoard
當我們多運行幾次之后,會出現(xiàn)不同的存放log文件的目錄。為了可以在TensorBoard中查看這些log文件,我們需要再程序運行的主目錄下面打開一個CMD窗口,通過如下命令打開TensorBoard:
tensorboard --logdir=logs/
運行上述命令之后,會出現(xiàn)如下提示:
TensorBoard 1.10.0 at http://DESKTOP-2S6AI38:6006 (Press CTRL+C to quit)
這時,只要將http://DESKTOP-2S6AI38:6006復制下來,在瀏覽器中打開就可以了。

TensorBoard的使用入門
通過在搜索框輸入*號則可以將所有的圖顯示出來。

可以看到一共有4張圖,acc(準確率),loss(損失),val_acc(驗證集準確率),val_loss(驗證集損失)。
在機器學習的程序中,我們的目標是讓準確率盡可能地提高,而損失則盡可能地降低。把鼠標放在圖上則可以看到圖上相應點的詳細信息。以驗證集損失為例。

通過分析驗證集損失的折線圖可以發(fā)現(xiàn),在第5個epoch之后,驗證集的損失開始上升。此時,如果機器學習的程序繼續(xù)運行下去的話,且驗證集準確度還在持續(xù)上升,那么則有可能會出現(xiàn)過擬合的情況。所以,在我們評估模型的時候,關(guān)注驗證集損失不失為很好地一個方法。
讓我們回到卷積網(wǎng)絡的程序中,對程序進行修改,如修改卷積核的大小,去掉一個全連接層等。此處我們選擇去掉全連接層,并且修改模型的名字之后重新訓練。

觀察淺藍色的曲線之后,發(fā)現(xiàn)去掉全連接層之后損失降得更低了,同時準確率也沒有大幅下降。這時證明了我們的改變極有可能優(yōu)化了模型。
下一講中,我們將專注于如何利用TensorBoard去優(yōu)化一個現(xiàn)有的模型。