logo
Loading...

Day99 請問如何實現先進行資料增強,再進行正規化? - Cupoy

Day99 的作業範例解答中,使用keras的ImageDataGenerator().flow()...

Day99 請問如何實現先進行資料增強,再進行正規化?

2020/07/03 下午 10:58
機器學習共學討論版
Nick
觀看數:21
回答數:1
收藏數:1

Day99 的作業範例解答中,使用keras的ImageDataGenerator().flow() 以及 model.fit_generator()實現 批次讀取資料增強。


範例解答在開始進行資料增強之前,已經對圖像資料正規化了,但是講義中有提到,要在資料增強之後,在進行正規化等動作。


所以想請問一下,要如何在使用ImageDataGenerator().flow() 以及 model.fit_generator() 的情況下,實現先進行資料增強,再進行正規化。



作業解答程式碼如下:

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

batch_size = 128 # batch 的大小,如果出現 OOM error,請降低這個值
num_classes = 10 # 類別的數量,Cifar 10 共有 10 個類別
epochs = 10 # 訓練的 epochs 數量

(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

# 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',
                 input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

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

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
model.summary()

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

augment_generator = ImageDataGenerator(rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True)

history = model.fit_generator(augment_generator.flow(x_train, y_train, batch_size=batch_size),
                    steps_per_epoch=int(len(x_train)/batch_size), # 一個 epochs 要執行幾次 update,通常是資料量除以 batch size
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

回答列表

  • 2020/07/05 下午 06:56
    張維元 (WeiYuan)
    贊同數:0
    不贊同數:1
    留言數:1

    嗨,Nick


    你想要問的是這樣的順序可不可行?還是程式碼該怎麼改?


    如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃