使用ImageDataGenerator训练模型遇警告及featurewise_center报错问题
问题解答
警告含义解析
这个警告的核心是:你配置的ImageDataGenerator开启了featurewise_center(特征级中心化)功能,但没有先在训练数据集上执行.fit()方法计算全局像素均值。
featurewise_center的作用是把所有样本的像素值减去整个训练集的像素均值,实现数据中心化,让模型更容易收敛。但这个均值必须先从训练数据中统计出来,如果跳过这一步,这个预处理逻辑就无法正常生效,因此框架抛出警告提醒你补全这个步骤。
添加featurewise_center报错的解决方法
你的代码报错根本原因是错误地将目录路径main_dir作为第一个参数传给了ImageDataGenerator——ImageDataGenerator的构造函数只接收预处理相关的配置参数(比如rescale、shear_range),目录路径是在后续flow_from_directory方法中指定的,这和加不加featurewise_center无关。
修正后的代码示例
- 正确创建
ImageDataGenerator并添加featurewise_center:
train_datagen = ImageDataGenerator( rescale=1. / 255, shear_range=0.2, zoom_range=0.2, width_shift_range=0.1, height_shift_range=0.1, brightness_range=[0.2,1.0], horizontal_flip=True, validation_split=0.2, featurewise_center=True # 现在可以正常添加该参数 ) test_datagen = ImageDataGenerator(rescale=1. / 255) val_datagen = ImageDataGenerator(rescale=1. / 255)
- 补全
featurewise_center要求的.fit()步骤:
因为featurewise_center需要训练集的全局均值,所以要先在训练数据上执行fit:
# 先初始化训练生成器 train_generator = train_datagen.flow_from_directory( directory=main_dir, subset="training", target_size=(img_w,img_h), batch_size=batch_size, class_mode="categorical" ) # 收集训练集数据并计算均值(适用于数据量不大的情况) import numpy as np train_data = [] for _ in range(len(train_generator)): batch, _ = next(train_generator) train_data.append(batch) train_data = np.concatenate(train_data) # 执行fit,让ImageDataGenerator获取训练集均值 train_datagen.fit(train_data) # 再初始化验证生成器(注意要在fit之后创建,确保用训练集均值做中心化) validation_generator = train_datagen.flow_from_directory( directory=main_dir, target_size=(img_w,img_h), batch_size=batch_size, class_mode="categorical", subset="validation" )
如果你的训练数据量极大,无法一次性加载到内存,可以通过遍历生成器分批计算均值,核心是让ImageDataGenerator拿到训练集的全局像素统计值。
内容的提问来源于stack exchange,提问作者a-eng
相关产品推荐
相关产品推荐

