You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用featurewise_center时Keras ImageDataGenerator配合fit()验证精度极低问题

问题分析与解决方案

我刚看完你的问题,一眼就发现了问题所在——你连续调用了两次datagen.fit(),一次用训练集,一次用验证集,这直接打乱了归一化的统计量!

问题根源

当你启用featurewise_center和featurewise_std_normalization时,datagen.fit()的作用是计算输入数据的全局均值和标准差,并把这些统计值存储在ImageDataGenerator实例内部。你先调用datagen.fit(x_t),这时候datagen已经正确学到了训练集的均值和标准差,但紧接着你又调用datagen.fit(x_v),这会用验证集的统计量覆盖掉之前训练集的数值。

结果就是:训练数据在生成时,用的是验证集的均值/std做归一化,完全偏离了模型训练需要的原始分布,模型根本学不到有效特征,精度暴跌到1%也就不足为奇了。

而你不调用fit()时精度正常,是因为这两个featurewise参数没有实际生效(没有统计量可以用来做归一化),相当于只执行了rescale=1./255,和你之前不用这两个参数的逻辑一致,所以精度和原来差不多,但这等于浪费了归一化的作用。

正确做法

只需要用训练集来fit datagen一次就够了!验证集和测试集不需要单独fit,它们必须使用和训练集完全相同的归一化规则(训练集的均值/std),这样才能保证数据分布一致,避免数据泄露,同时让验证结果准确。

修正后的关键代码如下:

# 启用featurewise参数
datagen = ImageDataGenerator(
    rescale=1./255,
    featurewise_center=True,
    featurewise_std_normalization=True,
    width_shift_range=0.1,
    height_shift_range=0.1
)
# 只需要用训练集拟合一次,计算全局统计量
datagen.fit(x_t)
# 删掉这行!不要用验证集fit
# datagen.fit(x_v)

train_gen = datagen.flow(x_t, y_train, batch_size=batch_size)
valid_gen = datagen.flow(x_v,y_valid, batch_size=batch_size)

额外提醒

  • featurewise_center/featurewise_std_normalization是基于整个训练集的全局统计,和samplewise_center/samplewise_std_normalization(单样本归一化)不同,后者不需要提前fit。
  • 后续用到测试集时,也绝对不要用测试集去fit datagen,直接用同一个datagen生成测试数据即可,确保归一化规则和训练阶段一致。

内容的提问来源于stack exchange,提问作者user915783

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:27:19