1. 程式人生 > >Keras入門課5 -- 網路視覺化及訓練監控

Keras入門課5 -- 網路視覺化及訓練監控

Keras入門課5:網路視覺化及訓練監控

本節專注於Keras中神經網路的視覺化,包括網路結構視覺化以及如何使用TensorBoard來監控訓練過程。
這裡我們借用第2課的程式碼內容來進行示例和講解。

網路前面的定義、資料初始化都一樣,主要是fit函式

啟用TensorBoard

在model的fit函式中加入TensorBoard的回撥函式即可,訓練資料就會自動儲存在log_dir指定的目錄內,然後在命令列啟動命令 tensorboard --logdir=./log 即可。TensorBoard會記錄loss及model.metrics裡面的值,本例中即acc,loss,val_acc,val_loss四個值,每個epoch更新一次。
除了這些SCALARS,還會記錄網路的GRAPH,直接視覺化網路結構,但是相比用原生TensorFlow生成的圖而言,相差還是比較大的,比較難看,所以不推薦在Keras中使用TensorBoard檢視網路結構。

我只訓練了2個epoch,所以只記錄下了兩個值。曲線圖如下
這裡寫圖片描述

↓直方圖,用來統計引數的分佈

這裡寫圖片描述

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
# 引入Tensorboard
from keras.callbacks import TensorBoard
from
keras.utils import plot_model (x_train,y_train),(x_test,y_test) = mnist.load_data() # out: np.ndarray x_train = x_train.reshape(-1,28,28,1) x_test = x_test.reshape(-1,28,28,1) input_shape = (28,28,1) x_train = x_train/255 x_test = x_test/255 y_train = keras.utils.to_categorical(y_train,10) y_test =
keras.utils.to_categorical(y_test,10)
Using TensorFlow backend.
/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/importlib/_bootstrap.py:205: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6
  return f(*args, **kwds)
model = Sequential()
model.add(Conv2D(filters = 32,kernel_size=(3,3),
                 activation='relu',input_shape = input_shape,name='conv1'))
model.add(Conv2D(64,(3,3),activation='relu',name='conv2'))
model.add(MaxPooling2D(pool_size=(2,2),name='pool2'))
model.add(Dropout(0.25,name='dropout1'))
model.add(Flatten(name='flat1'))
model.add(Dense(128,activation='relu'))
model.add(Dropout(0.5,name='dropout2'))
model.add(Dense(10,activation='softmax',name='output'))
plot_model(model,to_file='model.png')

↑keras的utils裡面專門有一個plot_model函式是用來視覺化網路結構的,為了保證格式美觀,我們在定義模型的時候給每個層都加了一個名字。
對於大多數的Keras的layers,都有name這一引數。
使用plot_model就可以生成類似下圖的一張圖片,相比TensorBoard的Graph要清晰明瞭很多。所以在Keras中列印圖結構還是推薦使用Keras自帶的方法。


這裡寫圖片描述

model.compile(loss = keras.losses.categorical_crossentropy,
             optimizer = keras.optimizers.Adadelta(),
             metrics=['accuracy'])

TensorBoard介面函式,有很多引數可選,具體細節可以參看官方文件。相比TensorFlow中的summary儲存而言,keras中的TensorBoard使用更為簡單,但是靈活性較差,只適合一些最基礎的使用。

tb = TensorBoard(log_dir='./logs',  # log 目錄
                 histogram_freq=1,  # 按照何等頻率(epoch)來計算直方圖,0為不計算
                 batch_size=32,     # 用多大量的資料計算直方圖
                 write_graph=True,  # 是否儲存網路結構圖
                 write_grads=False, # 是否視覺化梯度直方圖
                 write_images=False,# 是否視覺化引數
                 embeddings_freq=0, 
                 embeddings_layer_names=None, 
                 embeddings_metadata=None)
callbacks = [tb]
model.fit(x_train,y_train,batch_size=64,epochs=2
          ,verbose=1,validation_data=(x_test,y_test),
          callbacks=callbacks)

總結

  1. 學習瞭如何用TensorBoard監控訓練過程
  2. 學習瞭如何使用keras自帶的save_model函式來儲存網路圖

在使用plot_model繪製圖片的時候還遇到了一些錯誤,如果你也報錯,可以參看我的另一篇文章嘗試解決: Mac下使用Keras plot_model函式時出錯的解決辦法

參考: