gpt4 book ai didi

python - 使用 keras 的 sk-learn API 时出错

转载 作者:太空狗 更新时间:2023-10-29 20:49:11 28 4
gpt4 key购买 nike

这几天在学习keras,在使用scikit-learn 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:0000@localhost/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 打包的情况下运行良好,但我想在这之后使用 sk_learn 的 gridSearch,所以我在这里寻求帮助。我试过了,但还是不知道。

一些可能有用的东西:

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

这一行出现错误:

    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 是什么意思以及如何修复此错误?
谢谢!

最佳答案

xiao ,我遇到了同样的问题!希望这有助于:

背景和问题

documentation for Keras指出,在为 scikit-learn 实现包装器时,有两个参数。第一个是构建函数,它是一个“可调用函数或类实例”。具体来说,它指出:

build_fn should construct, compile and return a Keras model, which will then be used to fit/predict. One of the following three values could be passed to build_fn:

  1. A function
  2. An instance of a class that implements the call method
  3. None. This means you implement a class that inherits from either KerasClassifier or KerasRegressor. The call method of the present class will then be treated as the default build_fn.

在您的代码中,您创建模型,然后在创建 KerasRegressor 包装器时将模型作为参数 build_fn 的值传递:

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

问题就出在这里。您不是将 nn_model function 作为 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 方法的类),而是对我有用的解决方案。希望对您有所帮助!

关于python - 使用 keras 的 sk-learn API 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39467496/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com