Keras ImageDataGenerator 设置均值和标准差
Keras ImageDataGenerator setting mean and std
我有一个预训练的 keras 模型,我想在新数据集上使用它。我有来自预训练模型的权重、均值和标准文件,我想使用图像数据生成器中的 flow_from_directory 来加载新数据集。问题是如何显式设置均值和标准文件以进行规范化?
谢谢
我认为实现此目的的最佳方法是编写自己的方法来处理 flow_from_directory
生成的样本。它可能是这样的:
def custom_normilze_generator(directory, mean):
for img in flow_from_directory(directory):
yield (img - mean)
我认为您可以使用 ImageDataGenerator 的 'featurewise_center' 和 'featurewise_std_normalization' 来处理它。参考:https://keras.io/preprocessing/image/#imagedatagenerator-class
比如说,pre-trained 数据集的 [R, G, B] 平均值是 [123.68, 116.779, 103.939],std 是 64.0。然后您可以使用下面的示例代码:(使用 Keras 2 和 TF 后端,image_data_format='channels_last')
from keras.preprocessing import image
datagen = image.ImageDataGenerator(featurewise_center=True,
featurewise_std_normalization=True)
datagen.mean = np.array([123.68, 116.779, 103.939], dtype=np.float32).reshape((1,1,3)) # ordering: [R, G, B]
datagen.std = 64.
batches = datagen.flow_from_directory(DATASET_PATH + '/train',
target_size=(224,224),
color_mode='rgb',
class_mode='categorical',
shuffle=True,
batch_size=BATCH_SIZE)
我最终使用自定义仿函数来计算、存储和检索统计信息:
class Normaliser():
def __init__(self, mean=None, std=None):
self.mean = mean
self.std = std
def __call__(self, img):
if self.mean is not None:
img = self.center(img)
if self.std is not None:
img = self.scale(img)
return img
def center(self, img):
return img - self.mean
def scale(self, img):
return img / self.std
def normalise(self, img):
return (img - self.mean) / self.std
def set_mean(self, filepaths, input_size):
print("Calculating mean with shape: ", input_size)
self.mean = # calculate the mean
print("Mean is:", self.mean)
return True
def set_std(self, filepaths):
self.std = # calculate the std
return False
要使用它,给定输入大小 input_size
,将 Normaliser 的实例传递给 ImageDataGenerator
。
normaliser = Normaliser()
img_gen = ImageDataGenerator(preprocessing_function=normaliser)
使用 keras 预处理实用程序获取文件路径。我用了 flow_from_directory
iterator = img_gen.flow_from_directory(directory, input_size=input_size)
然后用
设置normaliser
的平均值
normaliser.set_mean(iterator.filepaths, input_size)
然后您可以按照自己的方式保存统计信息。
在预测阶段,您使用构造函数使用保存的均值重新创建 Normaliser
。
与直接使用 keras 生成器相比,它帮助我更灵活地处理我的数据,并更清楚地了解我对它所做的修改,这不是一件小事。
samplwise_center
和 featurewise_center
并不是将图像标准化为 this discussion describes
的唯一方法
我有一个预训练的 keras 模型,我想在新数据集上使用它。我有来自预训练模型的权重、均值和标准文件,我想使用图像数据生成器中的 flow_from_directory 来加载新数据集。问题是如何显式设置均值和标准文件以进行规范化?
谢谢
我认为实现此目的的最佳方法是编写自己的方法来处理 flow_from_directory
生成的样本。它可能是这样的:
def custom_normilze_generator(directory, mean):
for img in flow_from_directory(directory):
yield (img - mean)
我认为您可以使用 ImageDataGenerator 的 'featurewise_center' 和 'featurewise_std_normalization' 来处理它。参考:https://keras.io/preprocessing/image/#imagedatagenerator-class
比如说,pre-trained 数据集的 [R, G, B] 平均值是 [123.68, 116.779, 103.939],std 是 64.0。然后您可以使用下面的示例代码:(使用 Keras 2 和 TF 后端,image_data_format='channels_last')
from keras.preprocessing import image
datagen = image.ImageDataGenerator(featurewise_center=True,
featurewise_std_normalization=True)
datagen.mean = np.array([123.68, 116.779, 103.939], dtype=np.float32).reshape((1,1,3)) # ordering: [R, G, B]
datagen.std = 64.
batches = datagen.flow_from_directory(DATASET_PATH + '/train',
target_size=(224,224),
color_mode='rgb',
class_mode='categorical',
shuffle=True,
batch_size=BATCH_SIZE)
我最终使用自定义仿函数来计算、存储和检索统计信息:
class Normaliser():
def __init__(self, mean=None, std=None):
self.mean = mean
self.std = std
def __call__(self, img):
if self.mean is not None:
img = self.center(img)
if self.std is not None:
img = self.scale(img)
return img
def center(self, img):
return img - self.mean
def scale(self, img):
return img / self.std
def normalise(self, img):
return (img - self.mean) / self.std
def set_mean(self, filepaths, input_size):
print("Calculating mean with shape: ", input_size)
self.mean = # calculate the mean
print("Mean is:", self.mean)
return True
def set_std(self, filepaths):
self.std = # calculate the std
return False
要使用它,给定输入大小 input_size
,将 Normaliser 的实例传递给 ImageDataGenerator
。
normaliser = Normaliser()
img_gen = ImageDataGenerator(preprocessing_function=normaliser)
使用 keras 预处理实用程序获取文件路径。我用了 flow_from_directory
iterator = img_gen.flow_from_directory(directory, input_size=input_size)
然后用
设置normaliser
的平均值
normaliser.set_mean(iterator.filepaths, input_size)
然后您可以按照自己的方式保存统计信息。
在预测阶段,您使用构造函数使用保存的均值重新创建 Normaliser
。
与直接使用 keras 生成器相比,它帮助我更灵活地处理我的数据,并更清楚地了解我对它所做的修改,这不是一件小事。
samplwise_center
和 featurewise_center
并不是将图像标准化为 this discussion describes