Hyperas - 在Keras中自動選擇超參數
deep learning做到後面都剩下調參數
而參數又不是那麼容易調整,是個廢力又廢時的工作
這邊將介紹透過Hyperas這個套件,自動選擇符合model最好的參數
安裝Hyperas
使用pip
進行安裝
1 | $ pip install hyperas |
Import Hyperas
1 | from hyperopt import Trials, STATUS_OK, tpe |
Import Keras
1 | from keras.models import Sequential |
之後我們會依序
- 定義Data
- 定義Model
- Optimize model hyperparameters
定義Data
使用MNIST
的data
1 | def data(): |
定義Model
這邊除了定義Model外,還需完成training及testing,所以需把data傳進來
最後回傳一個dictionary,其中包含:
- loss: Hyperas會去選擇最小值的model
- status: 直接回傳
STATUS_OK
- model: 可不回傳(option)
1 | def create_model(X_train, Y_train, X_test, Y_test): |
原本Dropout需要傳入一個0-1的機率
但我們這邊不直接指定一個數字
而是透過uniform
幫我們產生一個0-1的數字
1 | model.add(Dropout({{uniform(0, 1)}})) |
Dense擇是透過choice
傳入我們要哪些值
1 | model.add(Dense({{choice([256, 512, 1024])}})) |
最後回傳的dictionary
我們目標是選擇最高的accuracy的model
但因為Huperas他會去選擇loss
這個value 最小的 的model
所以將accuracy直接變 負號
再丟給loss
1 | return {'loss': -acc, 'status': STATUS_OK, 'model': model} |
Optimize model hyperparameters
最後透過optim.minimize()
來找出最好的model
- model: 我們定義的model
- data: 我們定義的data
- algo: 使用TPE algorithm
- max_evals: evaluation次數
1 | X_train, Y_train, X_test, Y_test = data() |
optim.minimize()
會回傳
- best_run: 最好的參數組合
- best_model: 最好的model
最後
- Hyperas好像跟註解很不合,在跑程式時需把註解都刪掉,以免發生錯誤
- 如果是使用jupyter notebook需在
optim.minimize()
多加入notebook_name
這個參數且設定為ipynb
的檔名,假如目前為Untitled.ipynb
就設定為:
1 | best_run, best_model = optim.minimize(model=create_model, |