AttributeError: 'function' object has no attribute 'fit' in Keras
AttributeError: 'function' object has no attribute 'fit' in Keras
我正在训练一个 df
形状 (921, 10170)
的 Keras 模型和下面的代码(训练数据 X 被分成 2 段,因为数据的性质不同):
# 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()
发现错误
---------------------------------------------------------------------------
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'
尝试了 this answer 的解决方案,但仍然无效。请参阅以下错误:
---------------------------------------------------------------------------
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')
问题是这段代码之前是有效的。是否弃用了任何功能?错误是什么意思?
编辑 1:
我还尝试用下面的代码替换第 2 部分:
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()
并发现同样的错误:
---------------------------------------------------------------------------
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')
编辑 2:
我尝试替换
inputs_2 = keras.Input(shape=(85,))
和
inputs_2 = keras.Input(shape=(85,1))
它返回:
---------------------------------------------------------------------------
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)]
在您的代码中,my_model
是一个函数,因此您应该将代码更改为:
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])
...
关于你更新的问题,不是同一个错误。您的模型创建代码有一些错误。您可以尝试更正错误,如下所示:
model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], output = [layer7])
到
model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], outputs = [layer7])
我正在训练一个 df
形状 (921, 10170)
的 Keras 模型和下面的代码(训练数据 X 被分成 2 段,因为数据的性质不同):
# 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()
发现错误
---------------------------------------------------------------------------
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'
尝试了 this answer 的解决方案,但仍然无效。请参阅以下错误:
---------------------------------------------------------------------------
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')
问题是这段代码之前是有效的。是否弃用了任何功能?错误是什么意思?
编辑 1:
我还尝试用下面的代码替换第 2 部分:
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()
并发现同样的错误:
---------------------------------------------------------------------------
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')
编辑 2:
我尝试替换
inputs_2 = keras.Input(shape=(85,))
和
inputs_2 = keras.Input(shape=(85,1))
它返回:
---------------------------------------------------------------------------
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)]
在您的代码中,my_model
是一个函数,因此您应该将代码更改为:
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])
...
关于你更新的问题,不是同一个错误。您的模型创建代码有一些错误。您可以尝试更正错误,如下所示:
model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], output = [layer7])
到
model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], outputs = [layer7])