featurewise_center
преобразует изображения в 0.Это делается с помощью формул
X = X - среднее (X)
Но для того, чтобы ImageDataGenerator
осуществил это преобразование, ему нужно знать среднее значениенабор данных и метод fit
на ImageDataGenerator
выполняют именно эту операцию вычисления этой статистики.
Как объясняет keras docs
Подгоняет генератор данных к некоторым образцам данных.Это вычисляет внутреннюю статистику данных, связанную с зависимыми от данных преобразованиями, на основе массива выборочных данных.
Если набор данных может быть полностью загружен в память, мы можем сделать это, загрузив всеизображения в массив NumPy и запустить на нем fit
.
Пример кода (RGB-изображения 256x256):
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)
Но что, если данные не могут быть полностью загружены в память?Одним из подходов является выборка изображений случайным образом из набора данных.
Обычно мы используем mean
обучающих данных только для средней нормализации и используем то же самое среднее для нормализации / проверки данных.Будет немного сложно сделать то же самое через datagenerator
.