質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

713閲覧

hyperoptを使ってdeep learning(keras)のhyper parameterをtuning出来ない!

monolith_91

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

1クリップ

投稿2017/10/29 23:28

編集2017/10/29 23:54

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

targetがonehotエンコードされていないので、出力が1次元となり、分類できません。
以下に動くコードを添付します。

python3

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 sklearn.preprocessing import LabelBinarizer 11from keras.layers import Activation, Dropout, BatchNormalization, Dense 12from keras.models import Sequential 13from keras.datasets import mnist 14from keras.metrics import categorical_crossentropy 15from keras.utils import np_utils 16from keras.optimizers import Adam 17from keras.callbacks import EarlyStopping 18 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, 20, 30]), 27 'epochs': hp.choice('epochs', [5, 10, 20]), 28} 29 30#csvの分類ラベルが文字列で処理が面倒なので、予め数字にエンコードされたsklearnから 31from sklearn import datasets 32df = datasets.load_iris() 33iris_data = df.data 34iris_target_org = df.target 35#kerasの関数を使ってエンコードする、これでサイズ(None, 3)の配列になります。 36iris_target = np_utils.to_categorical(iris_target_org) 37 38input_n = iris_data.shape[1] 39output_n = np.unique(iris_target_org).shape[0] 40 41#5 fold cross validation 42skf = StratifiedKFold(iris_target_org, 5) 43 44count = 0 45 46def function(args): 47 for train, test in skf: 48 model = Sequential() 49 model.add(Dense(args['l1_out'], input_dim=input_n)) 50 if args['bn1'] == 0: 51 model.add(BatchNormalization()) 52 model.add(Activation('relu')) 53 model.add(Dropout(args['l1_drop'])) 54 model.add(Dense(args['l2_out'])) 55 if args['bn2'] == 0: 56 model.add(BatchNormalization()) 57 model.add(Activation('relu')) 58 model.add(Dropout(args['l2_drop'])) 59 model.add(Dense(output_n, activation='softmax')) 60 61 model.compile(loss='categorical_crossentropy', 62 optimizer=Adam(), 63 metrics=['accuracy']) 64 #model.summary() 65 66 early_stopping = EarlyStopping(patience=0, verbose=1) 67 model.fit(iris_data[train], iris_target[train], 68 batch_size=args['batch_size'], 69 epochs=args['epochs'], 70 verbose=1, 71 validation_split=0.2, 72 callbacks=[early_stopping]) 73 evaluation = model.evaluate(iris_data[test], iris_target[test], batch_size=args['batch_size'], verbose=0) 74 return evaluation[0] 75 76best = fmin(function,hyperopt_parameters,algo=tpe.suggest,max_evals=100) 77print("best estimate parameters",best)

投稿2017/10/30 03:58

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

monolith_91

2017/10/30 12:15

ありがとうございます!見事に動きました!本当に助かりました!m(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問