簡體   English   中英

Tensorflow DNNClassifier和scikit-learn GridSearchCV問題

[英]Tensorflow DNNClassifier and scikit-learn GridSearchCV issues

現在幾個小時我嘗試使用GridSearchCV在tensorflow DNN模型上執行超參數優化。 我的代碼的最新版本如下:

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))

我實際上已經從tensorflow庫本身的測試中tensorflow

當我運行它時,我收到以下錯誤:

---------------------------------------------------------------------------
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已將所有庫更新到最新版本,更准確地說:

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

我的想法用完了,我無法弄清楚我錯過了什么。 任何幫助,將不勝感激。 我當然假設我不需要修補或修改現有庫中的任何內容。

此問題來自克隆估計器,如堆棧錯誤中所指定。

new_object = klass(**new_object_params)

new_object_params返回上面的幾行:

new_object_params = estimator.get_params(deep=False)

正如您所看到的,估計器是您的DNNClassifier,其克隆正在進行gridsearchCV。 但是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版本中,init參數如下所示:

  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):
...
...

這里沒有名為params 因此錯誤。

但是如果你看到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版中搜索如何進行網格搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM