복붙노트

[PYTHON] 예측 중에 keras에서 데이터 정규화는 어떻게 작동합니까?

PYTHON

예측 중에 keras에서 데이터 정규화는 어떻게 작동합니까?

imageDataGenerator를 사용하여 다양한 스타일의 데이터 정규화를 지정할 수 있습니다. featurewise_center, samplewise_center 등

예제에서 볼 수 있듯이이 옵션 중 하나를 지정하면 생성기에서 맞는 방법을 호출하여 생성기에서 생성자의 평균 이미지와 같은 통계를 계산할 수 있도록해야합니다.

(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)

내 질문은, 훈련 도중 데이터 정규화를 지정했다면 예측은 어떻게 작동합니까? 나는 프레임 워크에서 훈련의 지식을 전달할 때 심지어 평균 / 표준 편차를 따라 내 테스트 데이터를 정상화 할 수 있을지 예측할 수는 없지만이 정보가있는 교육 코드는 볼 수 없다. 저장된.

예측 중에 사용할 수 있도록 정규화에 필요한 이미지 통계가 모델에 저장되어 있습니까?

해결법

  1. ==============================

    1.예 - Keras.ImageDataGenerator의 거대한 단점은 독자적으로 표준화 통계를 제공 할 수 없다는 것입니다. 하지만이 문제를 극복하는 방법은 쉬운 방법이 있습니다.

    예 - Keras.ImageDataGenerator의 거대한 단점은 독자적으로 표준화 통계를 제공 할 수 없다는 것입니다. 하지만이 문제를 극복하는 방법은 쉬운 방법이 있습니다.

    이미지 일괄 처리를 정규화하는 함수 normalize (x)가 있다고 가정합니다. 생성자는 이미지가 아닌 이미지 배열을 제공합니다. 모양이있는 일괄 처리 (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)을 사용하면됩니다.

    더욱이 - 맞춤법으로 계산 된 평균 및 표준을 복구 할 수 있습니다 (예 : datagen.mean 및 datagen.std).

  2. ==============================

    2.각 요소에 대해 생성기의 표준화 방법을 사용하십시오. 다음은 CIFAR 10의 전체 예제입니다.

    각 요소에 대해 생성기의 표준화 방법을 사용하십시오. 다음은 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))
    
  3. ==============================

    3.datagen.fit 함수 자체를 사용하고 있습니다.

    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)
    

    이것으로 이상적으로, training_datagen이 training 데이터 셋 통계를 학습하게됩니다. 그런 다음이 통계를 사용하여 테스트 데이터를 정규화합니다.

  4. ==============================

    4.나 또한 같은 문제가 있었고 동일한 기능을 사용하여 ImageDataGenerator를 사용하여 해결했습니다.

    나 또한 같은 문제가 있었고 동일한 기능을 사용하여 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이 제안한 해결책이 훨씬 더 합리적으로 들립니다.

  5. from https://stackoverflow.com/questions/41855512/how-does-data-normalization-work-in-keras-during-prediction by cc-by-sa and MIT license