使用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
相关产品推荐
相关产品推荐

