预测期间,数据标准化如何在keras中起作用?
keras
machine-learning
neural-network
python
5
0

我看到imageDataGenerator允许我指定不同样式的数据规范化,例如featurewise_center,samplewise_center等。

从示例中可以看到,如果指定了这些选项之一,则需要在生成器上调用fit方法,以允许生成器计算统计信息,例如生成器上的均值图像。

(X_train, y_train), (X_test, y_test) = cifar10.load_data()
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

# compute quantities required for featurewise normalization
# (std, mean, and principal components if ZCA whitening is applied)
datagen.fit(X_train)

# fits the model on batches with real-time data augmentation:
model.fit_generator(datagen.flow(X_train, Y_train, batch_size=32),
                samples_per_epoch=len(X_train), nb_epoch=nb_epoch)

我的问题是,如果我在训练期间指定了数据归一化,预测将如何工作?我看不到如何在框架中传递训练集均值/标准差的知识来预测如何使我自己对测试数据进行标准化,但是我也看不到训练代码中的这些信息存储。

归一化所需的图像统计信息是否存储在模型中,以便可以在预测期间使用?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

我正在使用datagen.fit函数本身。

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True)
train_datagen.fit(train_data)

test_datagen = ImageDataGenerator(  
    featurewise_center=True, 
    featurewise_std_normalization=True)
test_datagen.fit(train_data)

理想情况下,适合于训练数据集的test_datagen将学习训练数据集统计信息。然后,它将使用这些统计信息对测试数据进行标准化。

收藏
评论

对每个元素使用生成器的standardize方法。这是CIFAR 10的完整示例:

#!/usr/bin/env python

import keras
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D

# input image dimensions
img_rows, img_cols, img_channels = 32, 32, 3
num_classes = 10

batch_size = 32
epochs = 1

# The data, shuffled and split between train and test sets:
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# Convert class vectors to binary class matrices.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()

model.add(Conv2D(32, (3, 3), padding='same', activation='relu',
                 input_shape=x_train.shape[1:]))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='rmsprop',
              metrics=['accuracy'])

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

datagen = ImageDataGenerator(zca_whitening=True)

# Compute principal components required for ZCA
datagen.fit(x_train)

# Apply normalization (ZCA and others)
print(x_test.shape)
for i in range(len(x_test)):
    # this is what you are looking for
    x_test[i] = datagen.standardize(x_test[i])
print(x_test.shape)

# Fit the model on the batches generated by datagen.flow().
model.fit_generator(datagen.flow(x_train, y_train,
                                 batch_size=batch_size),
                    steps_per_epoch=x_train.shape[0] // batch_size,
                    epochs=epochs,
                    validation_data=(x_test, y_test))
收藏
评论

是的-这是Keras.ImageDataGenerator巨大缺点,您无法自行提供标准统计信息。但是-有一个简单的方法可以解决这个问题。

假设您具有一个normalize(x)图像批处理的 normalize(x)函数(请记住,生成器提供的不是简单图像而是图像数组-具有形状的批处理 (nr_of_examples_in_batch, image_dims ..)您可以使用以下方法制作自己的生成器:通过使用以下方式进行归一化:

def gen_with_norm(gen, normalize):
    for x, y in gen:
        yield normalize(x), y

然后,您可以简单地使用gen_with_norm(datagen.flow, normalize)而不是datagen.flow

此外,您可以通过从datagen中的适当字段(例如datagen.meandatagen.std )获取mean来恢复由fit方法计算出的meanstd差。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号