使用Keras Sequential模型调用fit_generator报NotImplementedError求助
问题分析与解决方案
你遇到的这个错误主要有两个核心原因,咱们一步步拆解:
1. fit_generator已被废弃
在TensorFlow 2.x版本中,fit_generator这个API已经被官方弃用——从TF 2.1开始,model.fit()就直接支持生成器(包括ImageDataGenerator生成的数据流)作为输入,不需要再用fit_generator了,这是触发报错的直接原因。
2. 模型未提前构建(次要因素)
你的Sequential模型没有显式定义输入形状,导致调用旧API时模型还处于未构建状态,这也加剧了错误。不过换成fit()后,这个问题会自动解决,因为fit会通过生成器的输入自动推断模型的输入形状。
另外还有一个隐藏问题必须修正:你的输出层用了relu激活函数,但搭配的是categorical_crossentropy损失,这完全不匹配——多分类任务(你这里是2类)的输出层应该用softmax激活,这样才能输出符合概率分布的结果,让损失函数正常工作。
修改后的完整代码
import tensorflow as tf # 数据生成器定义保持不变 traindata = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True ) input = traindata.flow_from_directory('VS/train') modelo = tf.keras.Sequential() # 可选:显式添加Input层,提前定义输入形状,让模型结构更清晰 modelo.add(tf.keras.layers.Input(shape=(256, 256, 3))) # 可根据你的图像实际尺寸调整,默认flow_from_directory会缩放为256x256 modelo.add(tf.keras.layers.Conv2D(32, (3, 3), activation='relu')) modelo.add(tf.keras.layers.Flatten()) modelo.add(tf.keras.layers.Dense(64, activation='relu')) # 输出层替换为softmax激活,适配categorical_crossentropy损失 modelo.add(tf.keras.layers.Dense(2, activation='softmax')) modelo.compile(loss='categorical_crossentropy', optimizer='rmsprop') # 用fit替代已废弃的fit_generator modelo.fit(input, epochs=1)
额外优化建议
- 如果你的任务是二分类,也可以改用
binary_crossentropy损失,此时输出层只需1个神经元,搭配sigmoid激活,计算效率会更高。 flow_from_directory默认会把图像缩放到256x256,如果你的原始图像尺寸不同,可以通过target_size参数指定,比如flow_from_directory('VS/train', target_size=(128, 128))。
内容的提问来源于stack exchange,提问作者Tim AI
相关产品推荐
相关产品推荐

