简体   繁体   中英

AttributeError: 'function' object has no attribute 'fit' in Keras

I am training a Keras model with df of shape (921, 10170) and code below(training data X is divided into 2 segments because the different nature of the data):

# Part 1:
X = df.iloc[:,0:10165]  
X = X.to_numpy()                      
X = X.reshape([X.shape[0], X.shape[1],1])
X_train_1 = X[:,0:10080,:]
X_train_2 = X[:,10080:10165,:].reshape(921,85)      
Y = df.iloc[:,10168:10170]
Y = Y.to_numpy()


def my_model():
   
    inputs_1 = keras.Input(shape=(10080, 1))
    layer1 = Conv1D(64, 14)(inputs_1)
    layer2 = layers.MaxPool1D(5)(layer1)
    layer3 = Conv1D(64, 14)(layer2)      
    layer4 = layers.GlobalMaxPooling1D()(layer3)

    inputs_2 = keras.Input(shape=(85,))
    layer5 = layers.concatenate([layer4, inputs_2])
    layer6 = Dense(128, activation='relu')(layer5)
    layer7 = Dense(2, activation='softmax')(layer6)

    model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], output = [layer7])
    adam = keras.optimizers.Adam(lr = 0.0001)
    model_2.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['acc'])
    return model_2    


# convert one_hot encoded labels to categorical labels for skf
Y_cat = np.argmax(Y, axis=1)

n_folds = 5
skf = StratifiedKFold(n_splits=n_folds, shuffle=True)
skf = skf.split(X_train_1, Y_cat)

cv_score = []





# Part 2 
for i, (train, test) in enumerate(skf):

   
    print("Running Fold", i+1, "/", n_folds)
    my_model.fit([X_train_1[train], X_train_2[train]], Y[train], epochs=150, batch_size=10)
    result = my_model.evaluate([X_train_1[test], X_train_2[test]], Y[test])

    cv_score.append(result[1])

    keras.backend.clear_session()

caught error

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-34-226dfd37f356> in <module>
     68 
     69     print("Running Fold", i+1, "/", n_folds)
---> 70     my_model.fit([X_train_1[train], X_train_2[train]], Y[train], epochs=150, batch_size=10)
     71     result = my_model.evaluate([X_train_1[test], X_train_2[test]], Y[test])


AttributeError: 'function' object has no attribute 'fit'

Tried solution from this answer but still didn't work. See error below:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-45c596dbb5bf> in <module>
     68 
     69     print("Running Fold", i+1, "/", n_folds)
---> 70     my_model().fit([X_train_1[train], X_train_2[train]], Y[train], epochs=150, batch_size=10)
     71     result = my_model.evaluate([X_train_1[test], X_train_2[test]], Y[test])


<ipython-input-36-45c596dbb5bf> in my_model()
     45     layer7 = Dense(2, activation='softmax')(layer6)
     46 
---> 47     model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], output = [layer7])

     49     adam = keras.optimizers.Adam(lr = 0.0001)

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\training\tracking\base.py in _method_wrapper(self, *args, **kwargs)
    455     self._self_setattr_tracking = False  # pylint: disable=protected-access
    456     try:
--> 457       result = method(self, *args, **kwargs)
    458     finally:
    459       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\training.py in __init__(self, *args, **kwargs)

--> 261     generic_utils.validate_kwargs(kwargs, {'trainable', 'dtype', 'dynamic',
    262                                            'name', 'autocast'})
    263     super(Model, self).__init__(**kwargs)

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\utils\generic_utils.py in validate_kwargs(kwargs, allowed_kwargs, error_message)
    776   for kwarg in kwargs:
    777     if kwarg not in allowed_kwargs:
--> 778       raise TypeError(error_message, kwarg)
    779 
    780 

TypeError: ('Keyword argument not understood:', 'inputs')

The issue is that this code was working before. Had any functions been deprecated? What dose the error mean?


Edit 1:

Also I tried to replace Part 2 with code below:


for i, (train, test) in enumerate(skf):

    model_2 = my_model()
   
    print("Running Fold", i+1, "/", n_folds)
    model_2.fit([X_train_1[train], X_train_2[train]], Y[train], epochs=150, batch_size=10)
    result = model_2.evaluate([X_train_1[test], X_train_2[test]], Y[test])
    cv_score.append(result[1])

    keras.backend.clear_session()

and caught the same error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-43-6fcd0e23bb77> in <module>

---> 67     model_2 = my_model()
     68 
     69     print("Running Fold", i+1, "/", n_folds)

<ipython-input-43-6fcd0e23bb77> in my_model()
     45     layer7 = Dense(2, activation='softmax')(layer6)
     46 
---> 47     model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], output = [layer7])
     48
     49     adam = keras.optimizers.Adam(lr = 0.0001)

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\training\tracking\base.py in _method_wrapper(self, *args, **kwargs)
    455     self._self_setattr_tracking = False  # pylint: disable=protected-access
    456     try:
--> 457       result = method(self, *args, **kwargs)
    458     finally:
    459       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\training.py in __init__(self, *args, **kwargs)

--> 261     generic_utils.validate_kwargs(kwargs, {'trainable', 'dtype', 'dynamic',
    262                                            'name', 'autocast'})
    263     super(Model, self).__init__(**kwargs)

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\utils\generic_utils.py in validate_kwargs(kwargs, allowed_kwargs, error_message)
    776   for kwarg in kwargs:
    777     if kwarg not in allowed_kwargs:
--> 778       raise TypeError(error_message, kwarg)
    779 
    780 

TypeError: ('Keyword argument not understood:', 'inputs')

Edit 2:

I tried to replace

inputs_2 = keras.Input(shape=(85,))

with

inputs_2 = keras.Input(shape=(85,1))

and it returned:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-49-dc0765c04da9> in <module>
     64 for i, (train, test) in enumerate(skf):
     65 
---> 66     model_2 = my_model()
     67 
     68     print("Running Fold", i+1, "/", n_folds)

<ipython-input-49-dc0765c04da9> in my_model()
     42     # inputs_2 = keras.Input(shape=(85, 1))
     43     inputs_2 = keras.Input(shape=(85,1))
---> 44     layer5 = layers.concatenate([layer4, inputs_2])
     45     layer6 = Dense(128, activation='relu')(layer5)
     46     layer7 = Dense(2, activation='softmax')(layer6)

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\layers\merge.py in concatenate(inputs, axis, **kwargs)
    929       A tensor, the concatenation of the inputs alongside axis `axis`.
    930   """
--> 931   return Concatenate(axis=axis, **kwargs)(inputs)
    932 
    933 

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\base_layer.py in __call__(self, *args, **kwargs)
    923     # >> model = tf.keras.Model(inputs, outputs)
    924     if _in_functional_construction_mode(self, inputs, args, kwargs, input_list):
--> 925       return self._functional_construction_call(inputs, args, kwargs,
    926                                                 input_list)
    927 

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\base_layer.py in _functional_construction_call(self, inputs, args, kwargs, input_list)
   1096         # Build layer if applicable (if the `build` method has been
   1097         # overridden).
-> 1098         self._maybe_build(inputs)
   1099         cast_inputs = self._maybe_cast_inputs(inputs, input_list)
   1100 

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\base_layer.py in _maybe_build(self, inputs)
   2641         # operations.
   2642         with tf_utils.maybe_init_scope(self):
-> 2643           self.build(input_shapes)  # pylint:disable=not-callable
   2644       # We must set also ensure that the layer is marked as built, and the build
   2645       # shape is stored since user defined build functions may not be calling

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\utils\tf_utils.py in wrapper(instance, input_shape)
    321     if input_shape is not None:
    322       input_shape = convert_shapes(input_shape, to_tuples=True)
--> 323     output_shape = fn(instance, input_shape)
    324     # Return shapes from `fn` as TensorShapes.
    325     if output_shape is not None:

~\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\layers\merge.py in build(self, input_shape)
    508       ranks = set(len(shape) for shape in shape_set)
    509       if len(ranks) != 1:
--> 510         raise ValueError(err_msg)
    511       # Get the only rank for the set.
    512       (rank,) = ranks

ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 64), (None, 85, 1)]

In your code, my_model is a function, so you should change the code like:

model = my_model()
model.fit([X_train_1[train], X_train_2[train]], Y[train], epochs=150, batch_size=10)
result = model.evaluate([X_train_1[test], X_train_2[test]], Y[test])
...

Regarding your updated questions, it is not the identical error. Your model creation code is of some errors. You could try to correct the errors something like as follows:

model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], output = [layer7])

to

model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], outputs = [layer7])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM