前提・実現したいこと
kerasでhyperoptを使ってパラメータのチューニングをしています。
https://teratail.com/questions/98390
の解答を参考にしながらコードを作成しています。
上記に記載されているコードでは
'batch_size': hp.choice('batch_size', [10, 20, 30])
と設定しているのですが、チューニングの結果は、
'batch_size': 1
となってしまいます。チューニングの結果が指定したパラメータの中から得られないのはなぜなのでしょうか?
'l1_out','l2_out'についても同様の問題が起きています。
該当のソースコード
import numpy as np
import pandas as pd
import random
from hyperopt import fmin, tpe, hp, rand
from sklearn.metrics import accuracy_score
from sklearn import cross_validation
from sklearn import svm
from sklearn.cross_validation import StratifiedKFold
from sklearn.preprocessing import LabelBinarizer
from keras.layers import Activation, Dropout, BatchNormalization, Dense
from keras.models import Sequential
from keras.datasets import mnist
from keras.metrics import categorical_crossentropy
from keras.utils import np_utils
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping
hyperopt_parameters = {
'l1_drop': hp.uniform('l1_drop', 0.0, 0.3),
'l2_drop': hp.uniform('l2_drop', 0.0, 0.3),
'l1_out': hp.choice('l1_out', [64, 128, 256, 512, 1024]),
'l2_out': hp.choice('l2_out', [64, 128, 256, 512, 1024]),
'bn1': hp.choice('bn1', [0, 1]),
'bn2': hp.choice('bn2', [0, 1]),
'batch_size': hp.choice('batch_size', [10, 20, 30]),
'epochs': hp.choice('epochs', [5]),
}
from sklearn import datasets
df = datasets.load_iris()
iris_data = df.data
iris_target_org = df.target
iris_target = np_utils.to_categorical(iris_target_org)
input_n = iris_data.shape[1]
output_n = np.unique(iris_target_org).shape[0]
skf = StratifiedKFold(iris_target_org, 5)
count = 0
def function(args):
args['epochs'] = int(args['epochs'])
for train, test in skf:
model = Sequential()
model.add(Dense(args['l1_out'], input_dim=input_n))
if args['bn1'] == 0:
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(args['l1_drop']))
model.add(Dense(args['l2_out']))
if args['bn2'] == 0:
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(args['l2_drop']))
model.add(Dense(output_n, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy']) early_stopping = EarlyStopping(patience=0, verbose=1) model.fit(iris_data[train], iris_target[train], batch_size=args['batch_size'], epochs=args['epochs'], verbose=1, validation_split=0.2, callbacks=[early_stopping]) evaluation = model.evaluate(iris_data[test], iris_target[test], batch_size=args['batch_size'], verbose=0) return evaluation[0]
best = fmin(function,hyperopt_parameters,algo=tpe.suggest,max_evals=1)
print("best estimate parameters",best)
試したこと
計算時間短縮のため、元のコードのmax_evalsとepochsを変更しています。
hp.choiceの使い方の問題があるのでしょうか、、?
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。