返回

解决 Keras 模型训练 `AttributeError: 'Functional' object has no attribute 'fit_generator'` 问题

python

Keras 模型训练时出现 AttributeError: 'Functional' object has no attribute 'fit_generator' 问题详解

前言

在使用 Keras 训练深度学习模型时,我们可能会遇到各种错误。其中,AttributeError: 'Functional' object has no attribute 'fit_generator' 是一个常见的问题,它表明模型无法使用 fit_generator 方法进行训练。本文将深入探讨这个问题的根源并提供一个全面的解决方案。

问题根源

fit_generator 方法专门用于顺序模型(Sequential),而不适用于函数式 API(Model)创建的模型。函数式 API 提供了更大的灵活性,但它缺乏顺序模型中的某些方法,例如 fit_generator

解决方法

要解决此问题,我们需要将模型创建方式从函数式 API 更改为顺序模型。以下是如何实现这一更改:

使用顺序模型

from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D

# 创建顺序模型
model = Sequential()

# 添加卷积层和最大池化层
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))
model.add(MaxPooling2D((2, 2)))

# 添加其他层
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 查看模型结构
model.summary()

# 编译模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 拟合模型
r = model.fit_generator(training_set,
                        validation_data=test_set,
                        epochs=5,
                        steps_per_epoch=len(training_set),
                        validation_steps=len(test_set))

其他注意事项

  • ImageDataGeneratorflow_from_directory 方法可用于从目录生成训练和测试数据生成器。
  • 使用 model.save()model.load_weights() 来保存和加载模型权重。

结论

AttributeError: 'Functional' object has no attribute 'fit_generator' 问题源于模型创建方式与拟合方法的不兼容性。通过将模型创建方式更改为顺序模型,我们可以解决此问题并成功训练我们的深度学习模型。

常见问题解答

  1. 为什么顺序模型具有 fit_generator 方法,而函数式 API 模型没有?

    顺序模型是 Keras 中一种更简单的模型类型,它提供了内置的方法,包括 fit_generator,用于简化训练过程。函数式 API 提供了更大的灵活性,但它需要更直接的方式来训练模型。

  2. 如何从函数式 API 模型切换到顺序模型?

    要从函数式 API 模型切换到顺序模型,只需创建一个新的顺序模型并手动添加层,与函数式 API 模型中使用的层相同。

  3. 可以使用 fit_generator 方法训练函数式 API 模型吗?

    不能,fit_generator 方法专门用于顺序模型。对于函数式 API 模型,我们需要使用 fit() 方法或 train_on_batch() 方法来训练模型。

  4. 什么是 ImageDataGeneratorflow_from_directory 方法?

    ImageDataGeneratorflow_from_directory 方法可用于从目录中生成训练和测试数据生成器。它读取图像、对其应用预处理,并将其作为批次提供给模型进行训练。

  5. 如何保存和加载 Keras 模型权重?

    可以使用 model.save() 方法保存模型权重,并使用 model.load_weights() 方法加载权重。这些方法允许我们保存模型的训练进度,以便在需要时重新使用它。