2017-04-26 12 views
1

GridSearchCV을 사용하여 tensorflow DNN 모델에서 하이퍼 매개 변수 최적화를 수행하는 데 몇 시간이 걸렸습니다. 실제로 a test in the tensorflow library itself에서 촬영 한Tensorflow DNNClassifier 및 scikit-learn GridSearchCV 문제

import random 
from tensorflow.contrib.learn.python import learn 
from sklearn import datasets 
from sklearn.model_selection import GridSearchCV 
from sklearn.metrics import accuracy_score 

random.seed(42) 
iris = datasets.load_iris() 
feature_columns = learn.infer_real_valued_columns_from_input(iris.data) 
classifier = learn.DNNClassifier(
      feature_columns=feature_columns, 
      hidden_units=[10, 20, 10], 
      n_classes=3) 
grid_search = GridSearchCV(
      classifier, {'hidden_units': [[5, 5], [10, 10]]}, 
      scoring='accuracy', 
      fit_params={'steps': [50]}) 
grid_search.fit(iris.data, iris.target) 
score = accuracy_score(iris.target, grid_search.predict(iris.data)) 

: 내 코드의 최신 버전은 다음과 같다.

나는 내가 다음과 같은 오류 얻을 실행하면 : 나는 아이디어가 부족

$ pip3 freeze 
numpy==1.12.1 
scikit-learn==0.18.1 
scipy==0.19.0 
tensorflow==1.1.0 

:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-4-dce950001f99> in <module>() 
    16   scoring='accuracy', 
    17   fit_params={'steps': [50]}) 
---> 18 grid_search.fit(iris.data, iris.target) 
    19 score = accuracy_score(iris.target, grid_search.predict(iris.data)) 

/home/nmiotto/Development/upday/hellseher/playground/lib/python3.5/site-packages/sklearn/model_selection/_search.py in fit(self, X, y, groups) 
    943    train/test set. 
    944   """ 
--> 945   return self._fit(X, y, groups, ParameterGrid(self.param_grid)) 
    946 
    947 

/home/nmiotto/Development/upday/hellseher/playground/lib/python3.5/site-packages/sklearn/model_selection/_search.py in _fit(self, X, y, groups, parameter_iterable) 
    548          n_candidates * n_splits)) 
    549 
--> 550   base_estimator = clone(self.estimator) 
    551   pre_dispatch = self.pre_dispatch 
    552 

/home/nmiotto/Development/upday/hellseher/playground/lib/python3.5/site-packages/sklearn/base.py in clone(estimator, safe) 
    68  for name, param in six.iteritems(new_object_params): 
    69   new_object_params[name] = clone(param, safe=False) 
---> 70  new_object = klass(**new_object_params) 
    71  params_set = new_object.get_params(deep=False) 
    72 

TypeError: __init__() got an unexpected keyword argument 'params' 

내가 Python 3.5.2을 사용하고 더 정확하게 최신 버전에 모든 라이브러리를 업데이트를 , 내가 무엇을 놓치고 있는지 알 수 없다. 어떤 도움을 주시면 감사하겠습니다. 물론 기존 라이브러리에 원숭이 패치 나 해킹 할 필요가 없다고 가정합니다.

답변

2

이 문제는 스택 오류에 지정된대로 견적을 복제하는 데서 발생합니다.

new_object = klass(**new_object_params) 

new_object_params

에 의해 위의 몇 줄을 반환 : 당신이 관찰

new_object_params = estimator.get_params(deep=False) 

, 추정기는 누구의 복제 gridsearchCV을하게되고 당신의 DNNClassifier이다. 그러나 estimator.get_params(deep=False) 반환 다음

{'params': {'head': <tensorflow.contrib.learn.python.learn.estimators.head._MultiClassHead object at 0x7f720df04490>, 
'hidden_units': [10, 20, 10], 
'feature_columns': (_RealValuedColumn(column_name='', dimension=4, default_value=None, dtype=tf.float64, normalizer=None),), 
'embedding_lr_multipliers': None, 'optimizer': None, 'dropout': None, 
'gradient_clip_norm': None, 
'activation_fn': <function relu at 0x7f7221aa8b18>, 'input_layer_min_slice_size': None}} 

당신은 첫 번째 매개 변수가 params라는시피. 이제 새로운 객체를 얻기 위해 DNNClassifier의 init_method를 설정하려고 시도 할 것입니다.

는 그러나 버전에서 tenserflow의 1.1.0는 초기화 매개 변수는 다음과 같습니다 : 여기 params를라는 이름의 매개 변수가

def __init__(self, 
       hidden_units, 
       feature_columns, 
       model_dir=None, 
       n_classes=2, 
       weight_column_name=None, 
       optimizer=None, 
       activation_fn=nn.relu, 
       dropout=None, 
       gradient_clip_norm=None, 
       enable_centered_bias=False, 
       config=None, 
       feature_engineering_fn=None, 
       embedding_lr_multipliers=None, 
       input_layer_min_slice_size=None, 
       label_keys=None): 
... 
... 

없습니다. 따라서 오류.

하지만 당신은이 같은 init() 방법에 대한 tensorflow의 현재 마스터 분기를 볼 경우 : https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/learn/python/learn/estimators/dnn.py#L327

super(DNNClassifier, self).__init__(
     model_fn=_dnn_model_fn, 
     model_dir=model_dir, 
     config=config, 
     params={ 
      "head": 
       head_lib.multi_class_head(
        n_classes, 
        weight_column_name=weight_column_name, 
        enable_centered_bias=enable_centered_bias, 
        label_keys=label_keys), 
      "hidden_units": hidden_units, 
      "feature_columns": self._feature_columns, 
      "optimizer": optimizer, 
      "activation_fn": activation_fn, 
      "dropout": dropout, 
      "gradient_clip_norm": gradient_clip_norm, 
      "embedding_lr_multipliers": embedding_lr_multipliers, 
      "input_layer_min_slice_size": input_layer_min_slice_size, 
     }, 
     feature_engineering_fn=feature_engineering_fn) 

은 그래서 어쩌면 마스터 지점에서보고 그 시험이 코드 변경 관련이있다. 현재 분기를 다운로드하고 직접 컴파일하여이 오류를 제거 할 수 있습니다.

그렇지 않으면 버전 1.1.0에서 그리드 검색 방법을 검색하십시오.

+0

나는 현재 마스터 버전을 시도했지만 여전히 운이 없다 (같은 오류). 또한 테스트는 실제로 작동하지 않는 것으로 보입니다. 아마도 테스트는 아니지만 오래전에 시도해 보았던 해킹 스크립트와 같을 것입니다. –

+0

@NicolaMiotto master 브랜치를 사용하여 체크 한 것을 havent합니다. 테스트 후 다시 연락 드리겠습니다. 동시에 ParameterGrid와 cross_val_score의 조합을 사용하여 동일한 효과를 얻을 수 있습니다. 필요한 경우 여기에 답변을 포함시켜 편집 할 수 있습니다. –