使用TensorBoard進行超參數優(yōu)化的實現
在本文中,我們將介紹超參數優(yōu)化,然后使用TensorBoard顯示超參數優(yōu)化的結果。
深度神經網絡的超參數是什么?
深度學習神經網絡的目標是找到節(jié)點的權重,這將幫助我們理解圖像、文本或語音中的數據模式。
要做到這一點,可以使用為模型提供最佳準度和精度的值來設計神經網絡參數。
那么,這些被稱為超參數的參數是什么呢?
用于訓練神經網絡模型的不同參數稱為超參數。這些超參數像旋鈕一樣被調優(yōu),以提高神經網絡的性能,從而產生一個優(yōu)化的模型。超參數的一個通俗的解釋是:用來優(yōu)化參數的參數。
神經網絡中的一些超參數是:
1.隱藏層的數量
2.隱含層中單位或節(jié)點的集合的數量
3.學習速率
4.DropOut比例
5.迭代次數
6.優(yōu)化器的選擇如SGD, Adam, AdaGrad, Rmsprop等
7.激活函數選擇如ReLU, sigmoid, leaky ReLU等
8.批次大小
如何實現超參數優(yōu)化?
超參數優(yōu)化是尋找深度學習算法的優(yōu)化器、學習率、等超參數值,從而獲得最佳模型性能的過程。
可以使用以下技術執(zhí)行超參數優(yōu)化。
- 手動搜索
- 網格搜索:對指定超參數的所有可能組合進行窮舉搜索,從而得到笛卡爾積。
- 隨機搜索:超參數是隨機選擇的,不是每一個超參數的組合都被嘗試。隨著超參數數量的增加,隨機搜索是一個更好的選擇,因為它可以更快地得到超參數的良好組合。
- 貝葉斯優(yōu)化:整合關于超參數的先驗數據,包括模型的準確性或損失。先驗信息有助于確定模型超參數選擇的更好近似。
為了在TensorBoard中可視化模型的超參數并進行調優(yōu),我們將使用網格搜索技術,其中我們將使用一些超參數,如不同的節(jié)點數量,不同的優(yōu)化器,或學習率等看看模型的準確性和損失。
為什么使用TensorBoard進行超參數優(yōu)化?
一幅圖片勝過千言萬語,這也適用于復雜的深度學習模型。深度學習模型被認為是一個黑盒子,你發(fā)送一些輸入數據,模型做一些復雜的計算,輸出結果。
TensorBoard是Tensorflow的一個可視化工具包,用于顯示不同的指標、參數和其他可視化,幫助調試、跟蹤、微調、優(yōu)化和共享深度學習實驗結果
TensorBoard可以跟蹤模型在每個訓練迭代的精度和損失;
還有不同的超參數值。不同超參數值的跟蹤精度將幫助您更快地微調模型。
我們將使用貓和狗數據集使用TensorBoard可視化標量、圖形和分布。
https://www.kaggle.com/c/dogs-vs-cats/data
導入所需的庫
導入TensorFlow和TensorBoard HParams插件以及Keras庫來預處理圖像和創(chuàng)建模型。
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
創(chuàng)建圖像分類的深度學習模型
為訓練設置關鍵參數
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)
重新調節(jié)驗證數據
validation_image_generator = ImageDataGenerator(rescale=1./255)
為訓練和驗證生成成批的規(guī)范化數據
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, target_size=(IMG_HEIGHT, IMG_WIDTH), class_mode='categorical')
為網格搜索(Grid Search)設置超參數
我們通過列出超參數的不同值或取值范圍,使用了四個超參數來運行我們的實驗。
對于離散超參數,將嘗試所有可能的參數組合,對于實值參數,只使用下界和上界。
第一層的單元數量:256和512
dropout比例:范圍在0.1到0.2之間。所以dropout比例是0。1和0。2。
優(yōu)化器:adam, SGD, rmsprop
優(yōu)化器的學習率: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'
創(chuàng)建和配置日志文件
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')], )
創(chuàng)建、編譯和訓練模型
超參數不是硬編碼的,但從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, 3, padding='same', activation='relu'), MaxPooling2D(), Dropout(hparams[HP_DROPOUT]), Flatten(), Dense(hparams[HP_NUM_UNITS], activation='relu'), 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比例、優(yōu)化器及其學習率,以及準確度用于準確性。
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"
當按精度降序排序時,可以看到最優(yōu)化的模型是256臺,dropout比例為0.2,rmsprop優(yōu)化器學習率為0.0005。
在jupyter notebook中可以使用以下命令查看
%tensorboard --logdir='\logs\hparam_tuning'
在Tensorboard中使用Parallel Coordinates視圖,顯示每個超參數的單獨運行情況并顯示精度,查找最優(yōu)化的超參數,以獲得最佳的模型精度
總結
Tensorboard為超參數調優(yōu)提供了一種可視化的方式來了解哪些超參數可以用于微調深度學習模型以獲得最佳精度,更多的操作可以查看官方文檔:
https://www.tensorflow.org/tensorboard/hyperparameter_tuning_with_hparams
作者:Renu Khandelwal
deephub翻譯組
到此這篇關于使用TensorBoard進行超參數優(yōu)化的實現的文章就介紹到這了,更多相關TensorBoard 超參數優(yōu)化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python免殺技術shellcode的加載與執(zhí)行
本文主要介紹了python免殺技術shellcode的加載與執(zhí)行,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04python中使用pyhook實現鍵盤監(jiān)控的例子
這篇文章主要介紹了python中使用pyhook實現鍵盤監(jiān)控的例子,包含pyhook的下載地址和手冊地址及一個Windows下的監(jiān)控實例,需要的朋友可以參考下2014-07-07