Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Specify Input Argument with KerasRegressor

I use a Keras neural network and I would like the input dimension to be automatically set, not hardcoded like in every tutorial I have seen so far. How could I accomplish this?

My code:

from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
seed = 1

X = df_input
Y = df_res

def baseline_model(x):
    # create model
    model = Sequential()    
    model.add(Dense(20, input_dim=x, kernel_initializer='normal', activation=relu))
    model.add(Dense(1, kernel_initializer='normal'))
    # Compile model
    model.compile(loss='mean_absolute_error', optimizer='adam')
    return model

inpt  = len(X.columns)
estimator = KerasRegressor(build_fn = baseline_model(inpt  ) , epochs=2, batch_size=1000, verbose=2)
estimator.fit(X,Y)

And the error I get:

Traceback (most recent call last):

File ipython-input-2-49d765e85d15, line 20, in estimator.fit(X,Y)

TypeError: call() missing 1 required positional argument: 'inputs'

like image 502
Marc S Avatar asked Dec 22 '17 16:12

Marc S


1 Answers

I would wrap your baseline_model as follows:

def baseline_model(x):
    def bm():
        # create model
        model = Sequential()
        model.add(Dense(20, input_dim=x, kernel_initializer='normal', activation='relu'))
        model.add(Dense(1, kernel_initializer='normal'))
        # Compile model
        model.compile(loss='mean_absolute_error', optimizer='adam')
        return model
    return bm

And then define and fit the KerasRegressor as:

estimator = KerasRegressor(build_fn=baseline_model(inpt), epochs=2, batch_size=1000, verbose=2)
estimator.fit(X, Y)

This avoids having to hardcode the input dimension in baseline_model.

like image 90
rvinas Avatar answered Sep 18 '22 00:09

rvinas