概要
Kerasで構築したニューラルネットワークのハイパーパラメータを自動チューニングする方法のメモです。
用語
・Anaconda:データサイエンスおよび機械学習関連アプリケーション(大規模データ処理、予測分析、科学計算)のためのPythonおよびRプログラミング言語のフリーでオープンソースのディストリビューション・Python:機械学習プログラミングに人気のプログラミング言語。
・Keras:Pythonで書かれたオープンソースニューラルネットワークライブラリ。tensorflowをラッピングして作られている。
・ニューラルネットワーク:脳機能を模して考案された機械学習のアルゴリズムの1つ。
・optuna:Kerasで構築するニューラルネットワークモデルのハイパーパラメータを自動チューニングしてくれるオープンソースライブラリ
事前準備(前提とする環境)
・Windows10 Professional・Anaconda
・Python3(バージョン3.7.2)
・Keras2.1.5
手順
optunaのインストール
まずは事前準備として、ハイパーパラメータを自動チューニングしてくれるライブラリのoptunaをインストールします。
$ pip install optuna
ハイパーパラメータ自動チューニングプログラムを作成
インストールが完了したら、早速プログラムを作成します。
自動チューニングするのは、前回本ブログで作成したニューラルネットワークモデル作成プログラムの「createModel.py」です。
具体的なプログラムは以下です。
今回も著者のプログラム能力不(ryです。
import datetime import importXLSX as ic import numpy as np import optuna from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization from keras.utils import np_utils def getData(fileDefinition, trainFilename, testFileName, superviser): # 入力データの作成 ------------------------------------------------------------------------- # 入力データの全件取得 print(datetime.datetime.today(), ' トレーニング用データの取得を開始します') trainData = ic.getData(fileDefinition, trainFilename, 1, 1, superviser) # 学習データと教師データの作成(Pandas) print(datetime.datetime.today(), ' トレーニング用データから学習データと教師データを作成します') x_train, y_train = ic.setSupData(superviser, trainData) # テストデータの作成 ----------------------------------------------------------------------- # テスト用データの全件取得 print(datetime.datetime.today(), ' テスト用データを作成します') testData = ic.getData(fileDefinition, testFileName, 1, 1, superviser) # テストデータと正解データの作成(Pandas) print(datetime.datetime.today(), ' テスト用データからテストデータと正解データを作成します') x_test, y_test = ic.setSupData(superviser, testData) return x_train, y_train, x_test, y_test def objective(trial): # パラメータ fileDefinition = 'nikkei225_def.xlsx' trainFilename = 'nikkei225.xlsx' testFileName = 'nikkei225_test.xlsx' superviser = '翌日日経平均' # データをロード x_train, y_train, x_test, y_test = getData(fileDefinition, trainFilename, testFileName, superviser) # 調整したいハイパーパラメータの設定 n_layer = trial.suggest_int('n_layer', 1, 3) # 追加する層を1-3から選ぶ mid_units = int(trial.suggest_discrete_uniform('mid_units', 100, 500, 1)) # ユニット数 dropout_rate = trial.suggest_uniform('dropout_rate', 0, 1) # ドロップアウト率 activation = trial.suggest_categorical('activation', ['relu', 'sigmoid']) # 活性化関数 optimizer = trial.suggest_categorical('optimizer', ['sgd', 'adam', 'rmsprop']) # 最適化アルゴリズム model = Sequential() model.add(Dense(x_train.shape[1], activation=activation)) model.add(BatchNormalization()) model.add(Dropout(dropout_rate)) for i in range(n_layer): model.add(Dense(mid_units, activation=activation)) model.add(BatchNormalization()) model.add(Dropout(dropout_rate)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer=optimizer) history = model.fit(x_train.values, y_train.values, epochs=500, batch_size=16, verbose=1, validation_split=0.1) score = model.evaluate(x_test.values, y_test.values, verbose=0) print('Test MSE : ', score) # 学習モデルの保存 model_json = model.to_json() with open('keras_model.json', 'w') as f_model: f_model.write(model_json) model.save_weights('keras_model.hdf5') # 最小値探索なので return -1 * score def main(): study = optuna.create_study(sampler=optuna.samplers.TPESampler()) study.optimize(objective, n_trials=15) print('best_params') print(study.best_params) print('-1 x best_value') print(-study.best_value) print('\n --- sorted --- \n') sorted_best_params = sorted(study.best_params.items(), key=lambda x : x[0]) for i, k in sorted_best_params: print(i + ' : ' + str(k)) if __name__ == '__main__': main()
0 件のコメント:
コメントを投稿