Hyperoptというpythonのライブラリーがあります。
これは、機械学習において、hyper parameterを自動的に最適化する優れものです。
また、tensolflowというdeep learningの強力なライブラリーがありますが、これを便利に使いやすくしたラッパーであるkerasを用いて、neural networkの様々なparameterをhyperoptでtuningしようとしていますが、下記エラーが出て巧く行きません!
ValueError: shape mismatch: value array of shape (120,3) could not be broadcast to indexing result of shape (120,)
なお、エラーが出ている箇所は下記です。
具体的には、出力層の数を指定する部分ですが、softmax関数による多クラス分類だからクラスの数である3で良いはずです!
model.add(Dense(output_dim=output_n))
↓また、エラー内容の示唆から、下記に代えても駄目でした!
model.add(Dense((120,1)))
なお、csvファイルはここからダウンロードしました。
https://github.com/pandas-dev/pandas/blob/master/pandas/tests/data/iris.csv
python
1#coding:utf-8 2import numpy as np 3import pandas as pd 4import random 5from hyperopt import fmin, tpe, hp, rand 6from sklearn.metrics import accuracy_score 7from sklearn import cross_validation 8from sklearn import svm 9from sklearn.cross_validation import StratifiedKFold 10from keras.layers import Activation, Dropout, BatchNormalization, Dense 11from keras.models import Sequential 12from keras.datasets import mnist 13from keras.metrics import categorical_crossentropy 14from keras.utils import np_utils 15from keras.optimizers import Adam 16from keras.callbacks import EarlyStopping 17 18#チューニングしたいkerasのHyperParameterを辞書にする。 19hyperopt_parameters = { 20 'l1_drop': hp.uniform('l1_drop', 0.0, 0.3), 21 'l2_drop': hp.uniform('l2_drop', 0.0, 0.3), 22 'l1_out': hp.choice('l1_out', [64, 128, 256, 512, 1024]), 23 'l2_out': hp.choice('l2_out', [64, 128, 256, 512, 1024]), 24 'bn1': hp.choice('bn1', [0, 1]), 25 'bn2': hp.choice('bn2', [0, 1]), 26 #'batch_size': hp.choice('batch_size', [10, 100, 500]), 27 'batch_size': hp.choice('batch_size', [10, 20, 30]), 28 'epochs': hp.choice('epochs', [5, 10, 20]), 29} 30 31#csvをpandas.dataflameとして読み込み 32df = pd.read_csv('iris.csv') 33#dfから説明(入力)変数だけ分離し、numpy.array型に変換 34iris_data = df.loc[:,'SepalLength':'PetalWidth'].values 35#dfから従属変数だけ分離し、numpy.array型に変換 36iris_target = df.loc[:,'Name'].values 37 38#説明(入力)変数の数(4つ) 39input_n = iris_data.shape[1] 40#従属変数のクラス数(3つ) 41output_n = len(list(set(iris_target))) 42 43#5 fold cross validation 44skf = StratifiedKFold(iris_target, 5) 45 46count = 0 47 48def function(args): 49 for train, test in skf: 50 model = Sequential() 51 model.add(Dense(args['l1_out'], input_dim=input_n)) 52 if args['bn1'] == 0: 53 model.add(BatchNormalization()) 54 model.add(Activation('relu')) 55 model.add(Dropout(args['l1_drop'])) 56 model.add(Dense(args['l2_out'])) 57 if args['bn2'] == 0: 58 model.add(BatchNormalization()) 59 model.add(Activation('relu')) 60 model.add(Dropout(args['l2_drop'])) 61 model.add(Dense(output_dim=output_n)) 62 #↑エラー箇所 63 model.add(Activation('softmax')) 64 model.compile(loss='categorical_crossentropy', 65 optimizer=Adam(), 66 metrics=['accuracy']) 67 early_stopping = EarlyStopping(patience=0, verbose=1) 68 model.fit(iris_data[train], iris_target[train], 69 batch_size=args['batch_size'], 70 epochs=args['epochs'], 71 verbose=0, 72 #validation_split=self.validation_split, 73 callbacks=[early_stopping]) 74 evaluation = model.evaluate(iris_data[test], iris_target[test], batch_size=args['batch_size'], verbose=0) 75 return evaluation 76 77#最良のparameterを表示 78best = fmin(function,hyperopt_parameters,algo=tpe.suggest,max_evals=100) 79print("best estimate parameters",best)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/30 12:15