Keras ImageDataGenerator设置mean和std

时间:2016-11-06 12:48:33

标签: python machine-learning keras

我有一个预训练的keras模型,我想在新的数据集上使用它。我有来自预训练模型的权重,均值和标准文件,我想使用图像数据生成器中的flow_from_directory来加载新数据集。问题是我如何显式设置均值和平均值的std和std文件?

由于

3 个答案:

答案 0 :(得分:2)

我认为实现这一目标的最佳方法是编写自己的方法来处理flow_from_directory生成的样本。它可能是这样的:

def custom_normilze_generator(directory, mean):
    for img in flow_from_directory(directory):
        yield (img - mean)

答案 1 :(得分:2)

我认为你可以使用' featurewise_center'和' featurewise_std_normalization' ImageDataGenerator来处理它。参考:https://keras.io/preprocessing/image/#imagedatagenerator-class

比如说,预训练数据集的平均[R,G,B]值是[123.68,116.779,103.939],标准是64.0。然后,您可以使用以下示例代码:(使用带有TF后端的Keras 2,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)

答案 2 :(得分:0)

我最终使用了自定义函子来计算,存储和检索统计信息:

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的情况下,将规范化器的实例传递给ImageDataGenerator

normaliser = Normaliser()
img_gen = ImageDataGenerator(preprocessing_function=normaliser)                         

使用keras预处理实用程序获取文件路径。我使用了flow_from_directory

iterator = img_gen.flow_from_directory(directory, input_size=input_size)

然后使用{p>设置normaliser的平均值

normaliser.set_mean(iterator.filepaths, input_size)

然后,您可以按照自己的方式保存统计信息。 在预测阶段,您可以使用构造函数使用保存的平均值重新创建Normaliser

与直接使用keras生成器相比,它帮助我在如何处理数据方面具有更大的灵活性,并更加清楚地说明了我对该数据进行的修改,这不是一件小事。 samplwise_centerfeaturewise_center并不是将图像标准化为this discussion describes

的唯一方法