2016-09-13 2 views
4

    я учусь keras в эти дни, и я встретил ошибку при использовании scikit учиться API.Here является чем-то, может быть полезно:ошибки при использовании keras ска учиться API

СРЕДЫ:

python:3.5.2 
keras:1.0.5 
scikit-learn:0.17.1 

КОД

import pandas as pd 
from keras.layers import Input, Dense 
from keras.models import Model 
from keras.models import Sequential 
from keras.wrappers.scikit_learn import KerasRegressor 
from sklearn.cross_validation import train_test_split 
from sklearn.cross_validation import cross_val_score 
from sqlalchemy import create_engine 
from sklearn.cross_validation import KFold 


def read_db(): 
    "get prepared data from mysql." 
    con_str = "mysql+mysqldb://root:[email protected]/nbse?charset=utf8" 
    engine = create_engine(con_str) 
    data = pd.read_sql_table('data_ml', engine) 
    return data 

def nn_model(): 
    "create a model." 
    model = Sequential() 
    model.add(Dense(output_dim=100, input_dim=105, activation='softplus')) 
    model.add(Dense(output_dim=1, input_dim=100, activation='softplus')) 
    model.compile(loss='mean_squared_error', optimizer='adam') 
    return model 

data = read_db() 
y = data.pop('PRICE').as_matrix() 
x = data.as_matrix() 
model = nn_model() 
model = KerasRegressor(build_fn=model, nb_epoch=2) 
model.fit(x,y) #something wrong here! 

ОШИБКА

Traceback (most recent call last): 
    File "C:/Users/Administrator/PycharmProjects/forecast/gridsearch.py", line 43, in <module> 
    model.fit(x,y) 
    File "D:\Program Files\Python35\lib\site-packages\keras\wrappers\scikit_learn.py", line 135, in fit 
    **self.filter_sk_params(self.build_fn.__call__)) 
TypeError: __call__() missing 1 required positional argument: 'x' 

Process finished with exit code 1 

    модель хорошо работает без упаковки с kerasRegressor, но я хочу, используя gridSearch sk_learn после этого, так что я нахожусь здесь для помощи. Я пытался, но до сих пор не знаю.

что-то может быть полезно:

keras.warappers.scikit_learn.py 

class BaseWrapper(object): 


    def __init__(self, build_fn=None, **sk_params): 
     self.build_fn = build_fn 
     self.sk_params = sk_params 
     self.check_params(sk_params) 


    def fit(self, X, y, **kwargs): 
     '''Construct a new model with build_fn and fit the model according 
     to the given training data. 
    # Arguments 
     X : array-like, shape `(n_samples, n_features)` 
      Training samples where n_samples in the number of samples 
      and n_features is the number of features. 
     y : array-like, shape `(n_samples,)` or `(n_samples, n_outputs)` 
      True labels for X. 
     kwargs: dictionary arguments 
      Legal arguments are the arguments of `Sequential.fit` 

    # Returns 
     history : object 
      details about the training history at each epoch. 
    ''' 

    if self.build_fn is None: 
     self.model = self.__call__(**self.filter_sk_params(self.__call__)) 
    elif not isinstance(self.build_fn, types.FunctionType): 
     self.model = self.build_fn(
      **self.filter_sk_params(self.build_fn.__call__)) 
    else: 
     self.model = self.build_fn(**self.filter_sk_params(self.build_fn)) 

    loss_name = self.model.loss 
    if hasattr(loss_name, '__name__'): 
     loss_name = loss_name.__name__ 
    if loss_name == 'categorical_crossentropy' and len(y.shape) != 2: 
     y = to_categorical(y) 

    fit_args = copy.deepcopy(self.filter_sk_params(Sequential.fit)) 
    fit_args.update(kwargs) 

    history = self.model.fit(X, y, **fit_args) 

    return history 

    ошибка occored в этой строке:

self.model = self.build_fn(
     **self.filter_sk_params(self.build_fn.__call__)) 

self.build_fn здесь является keras.models.Sequential

models.py 

class Sequential(Model): 

    def call(self, x, mask=None): 
     if not self.built: 
      self.build() 
     return self.model.call(x, mask) 

Так , что означает, что x означает d как исправить эту ошибку?
Спасибо!

ответ

4

xiao, я столкнулся с тем же вопросом! Надеюсь, что это помогает:

фона и выпуск

В documentation for Keras говорится, что при осуществлении Упаковщики для scikit-узнать, есть два аргумента. Первая - это функция сборки, которая является «вызываемой функцией или экземпляром класса». В частности, в нем говорится, что:

build_fnbuild_fn Необходимо построить, скомпилировать и вернуть модель Keras, которая затем будет использоваться для подгонки/прогнозирования. Один из следующих трех значений может быть передано build_fn:

  1. Функция
  2. Экземпляр класса, который реализует называем метода
  3. Отсутствуют. Это означает, что вы реализуете класс, который наследуется либо от KerasClassifier, либо от KerasRegressor. Метод данного класса будет рассматриваться как по умолчанию build_fn.

В коде, вы создаете модель, а затем передать модель в качестве значения для аргумента build_fn при создании KerasRegressor обертку:

model = nn_model() 
model = KerasRegressor(build_fn=model, nb_epoch=2) 

В этом и заключается проблема. Вместо того, чтобы передавать nn_modelфункции в качестве build_fn, вы передаете фактический экземпляр модели Keras Sequential. По этой причине, когда вызывается fit(), он не может найти метод call, потому что он не реализован в возвращенном классе.

Предлагаемое решение

Что я сделал, чтобы заставить вещи работать, это передать функцию в качестве build_fn, а не реальной модели:

data = read_db() 
y = data.pop('PRICE').as_matrix() 
x = data.as_matrix() 
# model = nn_model() # Don't do this! 
# set build_fn equal to the nn_model function 
model = KerasRegressor(build_fn=nn_model, nb_epoch=2) # note that you do not call the function! 
model.fit(x,y) # fixed! 

Это не единственное решение (вы можете установить build_fn к класс, который соответствующим образом реализует метод call), но тот, который работал для меня. Надеюсь, это поможет!

+1

Большое спасибо !!!!!!!!!!!!!!!!!!!!! это сработало, – xiao

+0

@matsuninja Знаете ли вы, как передать параметры функции? Я хотел бы создать более общую функцию «nn_model» с разными размерами слоев и такими параметрами ... – Luis

+0

@ Luis, в приведенном выше примере, помните, что код внутри функции nn_model определяет параметры модели (включая размеры слоев и т. Д.). .). Мое предложенное решение (опять же, только одна из нескольких альтернатив) передает функцию nn_model как значение build_fn. Чтобы установить параметры модели, измените код в функции nn_model; это на самом деле то, что делает xiao при определении функции nn_model. Надеюсь, это поможет. – matsuninja

Смежные вопросы