web-dev-qa-db-ja.com

予測中にケラでデータの正規化はどのように機能しますか?

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)

私の質問は、トレーニング中にデータの正規化を指定した場合、予測はどのように機能しますか?フレームワークでどのようにトレーニングセットの平均/標準偏差の知識を渡して予測するのかを見ることができません。テストデータを自分で正規化できるようにしますが、トレーニングコードにはこの情報がありません格納されます。

正規化に必要な画像統計は、予測中に使用できるようにモデルに保存されていますか?

17
Alex Taylor

はい-これは_Keras.ImageDataGenerator_の非常に大きなマイナス面であり、標準化統計を自分で提供することはできませんでした。しかし-この問題を克服する方法については簡単な方法があります。

画像を正規化する関数normalize(x)があると仮定しますbatch(ジェネレーターは単純な画像ではなく配列を提供していることを思い出してくださいイメージの-batch形状_(nr_of_examples_in_batch, image_dims ..)_を使用すると、以下を使用して正規化を行う独自のジェネレーターを作成できます。

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

次に、_datagen.flow_の代わりにgen_with_norm(datagen.flow, normalize)を使用するだけです。

さらに-meanメソッドで計算されたstdおよびfitを、datagenの適切なフィールドから取得することで回復できます(例_datagen.mean_および_datagen.std_ )。

21
Marcin Możejko

各要素に対してジェネレーターの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))
21
Martin Thoma

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はトレーニングデータセットに適合し、トレーニングデータセットの統計を学習します。次に、これらの統計を使用してテストデータを正規化します。

3
Hari

私も同じ問題を抱えており、ImageDataGeneratorが使用したのと同じ機能を使用して解決しました。

# Load Cifar-10 dataset
(trainX, trainY), (testX, testY) = cifar10.load_data()
generator = ImageDataGenerator(featurewise_center=True, 
                               featurewise_std_normalization=True)

# Calculate statistics on train dataset
generator.fit(trainX)
# Apply featurewise_center to test-data with statistics from train data
testX -= generator.mean
# Apply featurewise_std_normalization to test-data with statistics from train data
testX /= (generator.std + K.epsilon())

# Do your regular fitting
model.fit_generator(..., validation_data=(testX, testY), ...)

これは、CIFAR-10などの妥当な小さなデータセットがある場合にのみ可能であることに注意してください。それ以外の場合は、 Marcinによって提案された解決策 がより合理的に聞こえます。

1
Alexander Pacha