使用TensorBoard進行超引數優化的實現
在本文中,我們將介紹超引數優化,然後使用TensorBoard顯示超引數優化的結果。
深度神經網路的超引數是什麼?
深度學習神經網路的目標是找到節點的權重,這將幫助我們理解影象、文字或語音中的資料模式。
要做到這一點,可以使用為模型提供最佳準度和精度的值來設計神經網路引數。
那麼,這些被稱為超引數的引數是什麼呢?
用於訓練神經網路模型的不同引數稱為超引數。這些超引數像旋鈕一樣被調優,以提高神經網路的效能,從而產生一個優化的模型。超引數的一個通俗的解釋是:用來優化引數的引數。
神經網路中的一些超引數是:
1.隱藏層的數量
2.隱含層中單位或節點的集合的數量
3.學習速率
4.DropOut比例
6.優化器的選擇如SGD,Adam,AdaGrad,Rmsprop等
7.啟用函式選擇如ReLU,sigmoid,leaky ReLU等
8.批次大小
如何實現超引數優化?
超引數優化是尋找深度學習演算法的優化器、學習率、等超引數值,從而獲得最佳模型效能的過程。
可以使用以下技術執行超引數優化。
- 手動搜尋
- 網格搜尋:對指定超引數的所有可能組合進行窮舉搜尋,從而得到笛卡爾積。
- 隨機搜尋:超引數是隨機選擇的,不是每一個超引數的組合都被嘗試。隨著超引數數量的增加,隨機搜尋是一個更好的選擇,因為它可以更快地得到超引數的良好組合。
- 貝葉斯優化:整合關於超引數的先驗資料,包括模型的準確性或損失。先驗資訊有助於確定模型超引數選擇的更好近似。
為了在TensorBoard中視覺化模型的超引數並進行調優,我們將使用網格搜尋技術,其中我們將使用一些超引數,如不同的節點數量,不同的優化器,或學習率等看看模型的準確性和損失。
為什麼使用TensorBoard進行超引數優化?
一幅圖片勝過千言萬語,這也適用於複雜的深度學習模型。深度學習模型被認為是一個黑盒子,你傳送一些輸入資料,模型做一些複雜的計算,輸出結果。
TensorBoard是Tensorflow的一個視覺化工具包,用於顯示不同的指標、引數和其他視覺化,幫助除錯、跟蹤、微調、優化和共享深度學習實驗結果
TensorBoard可以跟蹤模型在每個訓練迭代的精度和損失;
還有不同的超引數值。不同超引數值的跟蹤精度將幫助您更快地微調模型。
我們將使用貓和狗資料集使用TensorBoard視覺化標量、圖形和分佈。
https://www.kaggle.com/c/dogs-vs-cats/data
匯入所需的庫
匯入TensorFlow和TensorBoard HParams外掛以及Keras庫來預處理影象和建立模型。
import tensorflow as tf from tensorboard.plugins.hparams import api as hp import datetime from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Conv2D,Flatten,Dropout,MaxPooling2D from tensorflow.keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img import numpy as np
載入TensorBoard notebook擴充套件
# Load the TensorBoard notebook extension %load_ext tensorboard
建立影象分類的深度學習模型
為訓練設定關鍵引數
BASE_PATH = 'Data\\dogs-vs-cats\\train\\' TRAIN_PATH='Data\\dogs-vs-cats\\train_data\\' VAL_PATH='Data\\dogs-vs-cats\\validation_data\\'batch_size = 32 epochs = 5 IMG_HEIGHT = 150 IMG_WIDTH = 150
對訓練影象進行縮放和不同的增強
train_image_generator = ImageDataGenerator( rescale=1./255,rotation_range=45,width_shift_range=.15,height_shift_range=.15,horizontal_flip=True,zoom_range=0.3)
重新調節驗證資料
validation_image_generator = ImageDataGenerator(rescale=1./255)
為訓練和驗證生成成批的規範化資料
train_data_gen = train_image_generator.flow_from_directory( batch_size = batch_size,directory=TRAIN_PATH,shuffle=True,target_size=(IMG_HEIGHT,IMG_WIDTH),class_mode='categorical') val_data_gen = validation_image_generator.flow_from_directory(batch_size = batch_size,directory=VAL_PATH,class_mode='categorical')
為網格搜尋(Grid Search)設定超引數
我們通過列出超引數的不同值或取值範圍,使用了四個超引數來執行我們的實驗。
對於離散超引數,將嘗試所有可能的引數組合,對於實值引數,只使用下界和上界。
第一層的單元數量:256和512
dropout比例:範圍在0.1到0.2之間。所以dropout比例是0。1和0。2。
優化器:adam,SGD,rmsprop
優化器的學習率:0.001,0.0001和0.0005,
我們還將準確率顯示在TensorBoard 上
## Create hyperparameters HP_NUM_UNITS=hp.HParam('num_units',hp.Discrete([ 256,512])) HP_DROPOUT=hp.HParam('dropout',hp.RealInterval(0.1,0.2)) HP_LEARNING_RATE= hp.HParam('learning_rate',hp.Discrete([0.001,0.0005,0.0001])) HP_OPTIMIZER=hp.HParam('optimizer',hp.Discrete(['adam','sgd','rmsprop']))METRIC_ACCURACY='accuracy'
建立和配置日誌檔案
log_dir ='\\logs\\fit\\' + datetime.datetime.now().strftime('%Y%m%d-%H%M%S') with tf.summary.create_file_writer(log_dir).as_default(): hp.hparams_config( hparams= [HP_NUM_UNITS,HP_DROPOUT,HP_OPTIMIZER,HP_LEARNING_RATE],metrics=[hp.Metric(METRIC_ACCURACY,display_name='Accuracy')],)
建立、編譯和訓練模型
超引數不是硬編碼的,但從hparams字典為不同的引數:HP_DROPOUT,HP_NUM_UNITS ,HP_OPTIMIZER ,HP_LEARNING_RATE。
函式返回最後一個批次的驗證準確性。
def create_model(hparams): model = Sequential([ Conv2D(64,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3)),MaxPooling2D(),#setting the Drop out value based on HParam Dropout(hparams[HP_DROPOUT]),Conv2D(128,activation='relu'),Dropout(hparams[HP_DROPOUT]),Flatten(),Dense(hparams[HP_NUM_UNITS],Dense(2,activation='softmax')]) #setting the optimizer and learning rate optimizer = hparams[HP_OPTIMIZER] learning_rate = hparams[HP_LEARNING_RATE] if optimizer == "adam": optimizer = tf.optimizers.Adam(learning_rate=learning_rate) elif optimizer == "sgd": optimizer = tf.optimizers.SGD(learning_rate=learning_rate) elif optimizer=='rmsprop': optimizer = tf.optimizers.RMSprop(learning_rate=learning_rate) else: raise ValueError("unexpected optimizer name: %r" % (optimizer_name,)) # Comiple the mode with the optimizer and learninf rate specified in hparams model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy']) #Fit the model history=model.fit_generator( train_data_gen,steps_per_epoch=1000,epochs=epochs,validation_data=val_data_gen,validation_steps=1000,callbacks=[ tf.keras.callbacks.TensorBoard(log_dir),# log metrics hp.KerasCallback(log_dir,hparams),# log hparams ]) return history.history['val_accuracy'][-1]
對於模型的每次執行,使用超引數和最終批次精度記錄hparams都會被紀律。我們需要將最後一個批次的驗證精度轉換為標量值。
def run(run_dir,hparams): with tf.summary.create_file_writer(run_dir).as_default(): hp.hparams(hparams) # record the values used in this trial accuracy = create_model(hparams) #converting to tf scalar accuracy= tf.reshape(tf.convert_to_tensor(accuracy),[]).numpy() tf.summary.scalar(METRIC_ACCURACY,accuracy,step=1)
用不同的超引數值執行模型
這裡的實驗使用網格搜尋,並測試第一層單元數的所有可能的超引數組合,Dropout比例、優化器及其學習率,以及準確度用於準確性。
session_num = 0for num_units in HP_NUM_UNITS.domain.values: for dropout_rate in (HP_DROPOUT.domain.min_value,HP_DROPOUT.domain.max_value): for optimizer in HP_OPTIMIZER.domain.values: for learning_rate in HP_LEARNING_RATE.domain.values: hparams = { HP_NUM_UNITS: num_units,HP_DROPOUT: dropout_rate,HP_OPTIMIZER: optimizer,HP_LEARNING_RATE: learning_rate,} run_name = "run-%d" % session_num print('--- Starting trial: %s' % run_name) print({h.name: hparams[h] for h in hparams}) run('logs/hparam_tuning/' + run_name,hparams) session_num += 1
在HParams中視覺化結果
python -m tensorboard.main --logdir="logs/hparam_tuning"
當按精度降序排序時,可以看到最優化的模型是256臺,dropout比例為0.2,rmsprop優化器學習率為0.0005。
在jupyter notebook中可以使用以下命令檢視
%tensorboard --logdir='\logs\hparam_tuning'
在Tensorboard中使用Parallel Coordinates檢視,顯示每個超引數的單獨執行情況並顯示精度,查詢最優化的超引數,以獲得最佳的模型精度
總結
Tensorboard為超引數調優提供了一種視覺化的方式來了解哪些超引數可以用於微調深度學習模型以獲得最佳精度,更多的操作可以檢視官方文件:
https://www.tensorflow.org/tensorboard/hyperparameter_tuning_with_hparams
作者:Renu Khandelwal
deephub翻譯組
到此這篇關於使用TensorBoard進行超引數優化的實現的文章就介紹到這了,更多相關TensorBoard 超引數優化內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!