基于Cats Vs Dogs数据集的图像增强CNN训练中,TensorFlow 2.5的model.fit()报错问题求助
ValueError: y argument is not supported when using keras.utils.Sequence as input错误 这个错误的原因很明确,咱们一步一步拆解问题并修复:
1. 直接错误:model.fit()参数传递错误
你当前调用model.fit()的方式是:
model.fit(train_data_gen, val_data_gen, batch_size = batch_size, epochs = 5)
这里的问题在于:model.fit()的第二个位置参数是y(训练数据的标签),但你的train_data_gen是ImageDataGenerator.flow_from_directory()生成的DirectoryIterator(属于keras.utils.Sequence类型),它本身已经包含了输入图像和对应的标签,完全不需要额外传入y参数。你把验证数据集val_data_gen放在第二个参数位置,Keras会误以为你要手动传入训练标签,而Sequence类型的输入不支持这种手动传标签的方式,所以抛出了错误。
修复方式
把验证数据放在专门的validation_data参数中,同时因为生成器已经定义了batch_size,不需要在fit里重复指定:
model.fit( train_data_gen, validation_data=val_data_gen, epochs=5 )
2. 验证数据集生成器的潜在问题
你对验证数据集做了这样的处理:
val_data_gen = val_data_gen.take(batch_size).cache().repeat()
这里的take(batch_size)会让验证集只取batch_size个批次(也就是64个批次,对应64*64=4096张图,但你的验证集只有1000张),这会导致验证数据被错误截断,完全不符合预期。
修复方式
恢复你之前注释掉的正确处理方式,用prefetch提升性能,去掉多余的take()和repeat()(repeat()会让验证集无限重复,但model.fit()每个epoch只会遍历验证集一次,不需要重复):
AUTOTUNE = tf.data.AUTOTUNE val_data_gen = val_data_gen.cache().prefetch(buffer_size=AUTOTUNE)
3. 模型配置的优化建议(非必要但更规范)
你的模型最后一层用了Dense(2, activation='sigmoid'),搭配sparse_categorical_crossentropy损失,虽然能运行,但不是最匹配的配置:
sparse_categorical_crossentropy通常对应**softmax激活**(输出所有类别的概率和为1,适配多分类场景)sigmoid更适合二分类场景下输出单个单元(输出0-1的概率,代表其中一类的可能性)
你可以二选一调整:
选项1:适配多分类规范
把最后一层改成softmax激活:
model.add( Dense( units=2, activation='softmax' ) )
损失保持sparse_categorical_crossentropy即可。
选项2:适配二分类规范
把最后一层改成单个单元,损失换成binary_crossentropy:
model.add( Dense( units=1, activation='sigmoid' ) )
编译时修改损失:
model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy'] )
这样的配置会更符合Keras的设计规范,也能避免潜在的逻辑混淆。
内容的提问来源于stack exchange,提问作者Arun

