前提・実現したいこと
kerasでCNNを構築して、ハイパーパラメータをhyperasを用いて探索していようとしています。
ちなみに学習、検証データはデータ拡張をしたいので、ImageDataGenerator.flow_from_directoryを使ってデータを持ってきています。
発生している問題・エラーメッセージ
>>> Imports: #coding=utf-8 try: import os except: pass try: import keras except: pass try: from keras import layers except: pass try: from keras import models except: pass try: from keras import optimizers except: pass try: from keras.preprocessing.image import ImageDataGenerator except: pass try: from keras.utils import plot_model except: pass try: from hyperopt import Trials, STATUS_OK, tpe except: pass try: from hyperas import optim except: pass try: from hyperas.distributions import choice, uniform except: pass Traceback (most recent call last): File "model.py", line 78, in <module> trials=Trials()) File "/home/yukawa/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/hyperas/optim.py", line 69, in minimize keep_temp=keep_temp) File "/home/yukawa/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/hyperas/optim.py", line 98, in base_minimizer model_str = get_hyperopt_model_string(model, data, functions, notebook_name, verbose, stack) File "/home/yukawa/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/hyperas/optim.py", line 191, in get_hyperopt_model_string parts = hyperparameter_names(model_string) File "/home/yukawa/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/hyperas/optim.py", line 258, in hyperparameter_names parts.append(parts[-1]) IndexError: list index out of range
該当のソースコード
python
1import os 2import keras 3from keras import layers 4from keras import models 5from keras import optimizers 6from keras.preprocessing.image import ImageDataGenerator 7from keras.utils import plot_model 8from hyperopt import Trials, STATUS_OK, tpe 9from hyperas import optim 10from hyperas.distributions import choice, uniform 11def model(train_generator, valid_generator): 12 model = models.Sequential() 13 if {{choice(['normarize','no_normarize'])}} == 'normarize': 14 model.add(layers.Conv2D({{choice([32, 64, 128])}}, (3, 3), activation='relu', input_shape=(150, 150, 1))) 15 model.add(layers.normalization.BatchNormalization()) 16 model.add(layers.MaxPooling2D((2, 2))) 17 model.add(layers.Conv2D({{choice([64, 128, 256])}}, (3, 3), activation='relu')) 18 model.add(layers.normalization.BatchNormalization()) 19 model.add(layers.MaxPooling2D((2, 2))) 20 model.add(layers.Conv2D({{choice([64, 128, 256])}}, (3, 3), activation='relu')) 21 model.add(layers.normalization.BatchNormalization()) 22 model.add(layers.Flatten()) 23 model.add(layers.Dropout({{uniform(0,1)}})) 24 model.add(layers.Dense({{choice([50, 100, 150])}}, activation='relu')) 25 model.add(layers.normalization.BatchNormalization()) 26 model.add(layers.Dense(1, activation='sigmoid')) 27 elif {{choice(['normarize','no_normarize'])}} == 'no_normarize': 28 model.add(layers.Conv2D({{choice([32, 64, 128])}}, (3, 3), activation='relu', input_shape=(150, 150, 1))) 29 model.add(layers.MaxPooling2D((2, 2))) 30 model.add(layers.Conv2D({{choice([64, 128, 256])}}, (3, 3), activation='relu')) 31 model.add(layers.MaxPooling2D((2, 2))) 32 model.add(layers.Conv2D({{choice([64, 128, 256])}}, (3, 3), activation='relu')) 33 model.add(layers.Flatten()) 34 model.add(layers.Dropout({{uniform(0,1)}})) 35 model.add(layers.Dense({{choice([50, 100, 150])}}, activation='relu')) 36 model.add(layers.Dense(1, activation='sigmoid')) 37 model.compile(loss='binary_crossentropy', 38 optimizer=optimizers.Adam(lr=1e-4), 39 metrics=['acc']) 40 model.fit_generator(train_generator, 41 steps_per_epoch=64, 42 epochs=20, 43 validation_data=valid_generator, 44 validation_steps=64) 45 val_loss, val_acc = model.evaluate_generator(valid_generator, verbose=0) 46 return {'loss': -val_acc, 'status': STATUS_OK, 'model': model} 47def data(): 48 train_dir = 'train' 49 valid_dir = 'valid' 50 train_datagen = ImageDataGenerator(rescale=1./255, 51 rotation_range=40, 52 width_shift_range=0.2, 53 height_shift_range=0.2, 54 shear_range=0.2, 55 zoom_range=0.2, 56 horizontal_flip=True) 57 valid_datagen = ImageDataGenerator(rescale=1./255) 58 train_generator = train_datagen.flow_from_directory(train_dir, 59 target_size=(150, 150), 60 color_mode='grayscale', 61 batch_size=64, 62 class_mode='binary') 63 valid_generator = valid_datagen.flow_from_directory(valid_dir, 64 target_size=(150, 150), 65 color_mode='grayscale', 66 batch_size=64, 67 class_mode='binary') 68 return train_generator, valid_generator 69if __name__ == '__main__': 70 output_dir = 'model_output' 71 if not os.path.exists(output_dir): 72 os.mkdir(output_dir) 73 train_generator, validation_generator = data() 74 best_run, best_model = optim.minimize(model=model, 75 data=data, 76 algo=tpe.suggest, 77 max_evals=100, 78 trials=Trials()) 79 best_model.summary() 80 print(best_run) 81 val_loss, val_acc = best_model.evaluate_generator(valid_generator, verbose=0) 82 print('val_loss : {}'.format(val_loss)) 83 print('val_acc : {}'.format(val_acc)) 84 best_model.save(output_dir + '/cnn_model.h5') 85 plot_model(best_model, show_shapes=True, to_file=output_dir + '/model.png') 86
試したこと
コメントアウトなどの不要な行があるとこのようなエラーなるとあったので、削除してもエラーは変わりませんでした。
何かしらご意見をよろしくお願いします。
あなたの回答
tips
プレビュー