如何在 ImageDataGenerator 中将 featurewise_center=True 与 flow_from_directory 一起使用?

Mlu*_*lui 6 deep-learning keras

我设置featurewise_center = True然后用于flow_from_directory在 keras 中设置我的训练和验证数据。但是,我得到了错误

UserWarning: This ImageDataGenerator specifies `featurewise_center`, 
but it hasn't been fit on any training data. Fit it first by calling `.fit(n
numpy_data)`
Run Code Online (Sandbox Code Playgroud)

有什么方法可以使用flow_from_directory然后根据需要拟合数据吗?

muj*_*iga 5

featurewise_center将图像转换为 0 均值。这是通过使用公式完成的

X = X - 平均值(X)

但是为了ImageDataGenerator进行这种转换,它需要知道数据集的均值和fit方法来ImageDataGenerator执行计算这些统计数据的操作。

正如keras 文档所解释的

使数据生成器适合一些样本数据。这将根据样本数据数组计算与数据相关转换相关的内部数据统计信息。

如果数据集可以完全加载到内存中,我们可以通过将所有图像加载到一个 numpy 数组中并在其fit上运行来实现。

示例代码(256x256 的 RGB 图像):

from keras.layers import Input, Dense, Flatten, Conv2D
from keras.models import Sequential
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
from pathlib import Path
from PIL import Image

height = width = 256 

def read_pil_image(img_path, height, width):
        with open(img_path, 'rb') as f:
            return np.array(Image.open(f).convert('RGB').resize((width, height)))

def load_all_images(dataset_path, height, width, img_ext='png'):
    return np.array([read_pil_image(str(p), height, width) for p in 
                                    Path(dataset_path).rglob("*."+img_ext)]) 

train_datagen = ImageDataGenerator(featurewise_center=True)
train_datagen.fit(load_all_images('./images/', height, width))

train_generator = train_datagen.flow_from_directory(
        './images/',
        target_size=(height, width),
        batch_size=32,
        class_mode='binary',
        color_mode='rgb')

model = Sequential()
model.add(Conv2D(1,(3,3), input_shape=(height,width,3)))
model.add(Flatten())
model.add(Dense(1))
model.compile('adam', 'binary_crossentropy')

model.fit_generator(train_generator)
Run Code Online (Sandbox Code Playgroud)

但是如果数据不能完全加载到内存中怎么办?一种方法是从数据集中随机采样图像。

通常我们只使用mean训练数据进行均值归一化,而对归一化验证/测试数据使用相同的均值。通过datagenerator.