2017-01-05 11 views
2

ケラスで構築されたニューラルネットワークのパラメータチューニングを実行しようとしています。これは、エラーの原因となる行にコメントと私のコードです:Kerasニューラルネットワークを使用したGridSearch

from sklearn.cross_validation import StratifiedKFold, cross_val_score 
from sklearn import grid_search 
from sklearn.metrics import classification_report 
import multiprocessing 

from keras.models import Sequential 
from keras.layers import Dense 
from sklearn.preprocessing import LabelEncoder 
from keras.utils import np_utils 
from keras.wrappers.scikit_learn import KerasClassifier 
import numpy as np 


def tuning(X_train,Y_train,X_test,Y_test): 

    in_size=X_train.shape[1] 
    num_cores=multiprocessing.cpu_count() 
    model = Sequential() 
    model.add(Dense(in_size, input_dim=in_size, init='uniform', activation='relu')) 
    model.add(Dense(8, init='uniform', activation='relu')) 
    model.add(Dense(1, init='uniform', activation='sigmoid')) 
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

    batch_size = [10, 20, 40, 60, 80, 100] 
    epochs = [10,20] 
    param_grid = dict(batch_size=batch_size, nb_epoch=epochs) 

    k_model = KerasClassifier(build_fn=model, verbose=0) 
    clf = grid_search.GridSearchCV(estimator=k_model, param_grid=param_grid, cv=StratifiedKFold(Y_train, n_folds=10, shuffle=True, random_state=1234), 
        scoring="accuracy", verbose=100, n_jobs=num_cores) 

    clf.fit(X_train, Y_train) #ERROR HERE 

    print("Best parameters set found on development set:") 
    print() 
    print(clf.best_params_) 
    print() 
    print("Grid scores on development set:") 
    print() 
    for params, mean_score, scores in clf.grid_scores_: 
    print("%0.3f (+/-%0.03f) for %r" 
     % (mean_score, scores.std() * 2, params)) 
    print() 
    print("Detailed classification report:") 
    print() 
    print("The model is trained on the full development set.") 
    print("The scores are computed on the full evaluation set.") 
    print() 
    y_true, y_pred = Y_test, clf.predict(X_test) 
    print(classification_report(y_true, y_pred)) 
    print() 

そして、これはエラーが報告されています

clf.fit(X_train, Y_train) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/grid_search.py", line 804, in fit 
    return self._fit(X, y, ParameterGrid(self.param_grid)) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/grid_search.py", line 553, in _fit 
    for parameters in parameter_iterable 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 800, in __call__ 
    while self.dispatch_one_batch(iterator): 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 658, in dispatch_one_batch 
    self._dispatch(tasks) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 566, in _dispatch 
    job = ImmediateComputeBatch(batch) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 180, in __init__ 
    self.results = batch() 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 72, in __call__ 
    return [func(*args, **kwargs) for func, args, kwargs in self.items] 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/cross_validation.py", line 1531, in _fit_and_score 
    estimator.fit(X_train, y_train, **fit_params) 
    File "/usr/local/lib/python2.7/dist-packages/keras/wrappers/scikit_learn.py", line 135, in fit 
    **self.filter_sk_params(self.build_fn.__call__)) 
TypeError: __call__() takes at least 2 arguments (1 given) 

は、私は何かが足りないのですか?グリッド検索は、ランダムなフォレスト、SVM、ロジスティック回帰に適しています。私はニューラルネットワークにのみ問題があります。

答えて

2

ここでエラーは、build_fnparam_gridのパラメータの#から示されるように2つの引数を持つ必要があることを示します。

ですから、明示的に新しい関数を定義する必要があるとbuild_fn=make_model

def make_model(batch_size, nb_epoch): 
    model = Sequential() 
    model.add(Dense(in_size, input_dim=in_size, init='uniform', activation='relu')) 
    model.add(Dense(8, init='uniform', activation='relu')) 
    model.add(Dense(1, init='uniform', activation='sigmoid')) 
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
    return model 

としてことを使用する。またGridSearchCVはハイパーパラメータの検索に使用されてkeras/examples/mnist_sklearn_wrapper.pyを確認してください。

+0

であなたは正しいです!私はそれを理解できませんでした。ありがとう! –

+0

問題ありません。また、今、あなたは 'batch_size'と' nb_epoch'でパラメータ検索をしていることに気付きました。それらはkerasモデルフィットパラメータです。現在の構造では動作しません。私はそれを行うことができると思うが、ラッパーコードを変更する必要がある。代わりに、https://github.com/maxpumperla/hyperasを使用して、それらを簡単にハイパーパラメータとして使用することをお勧めします – indraforyou

0

私は恐らくscikit-learn 0.16以前のバージョンを使用すると思います。
私は昨日同じ問題に遭遇しましたが、いくつかの回避策の後、私はscikit-learnを0.16から0.18にアップグレードすることが問題を解決することを知りました。 0.16から0.18異なりがGridSearchCVであることを

clf.fit(X_train, Y_train) #SHOULD WORK with scikit-learn 0.18 

もう一つはsklearn.grid_searchを思い付くしませんが、sklearn.model_selection

関連する問題