2019年1月20日 星期日

深度學習 - Kaggle - Dog & Cat - 使用數據增強訓練

深度學習 - Kaggle - Dog & Cat - 使用數據增強訓練

我們已經在未經過任何處理的訓練模型,得到精度約65~75%。在這邊我們使用數據增強,來提高訓練&驗證精度。

使用windows OS,GeForce GTX 1060 來訓練模型。
先給定資料夾位置
original_dataset_dir ='C:\\Users\\Lido\\Downloads\\kaggle_original_data'
base_dir = 'C:\\Users\\Lido\\Downloads\\cats_and_dogs_small'
train_dir = 'C:\\Users\\Lido\\Downloads\\cats_and_dogs_small\\train'
validation_dir = 'C:\\Users\\Lido\\Downloads\\cats_and_dogs_small\\validation'

建立模型
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

選擇優化器,損失函數,指標
from keras import optimizers
model.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=1e-4), metrics=['acc'])

使用數據增強訓練
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255,
                                   rotation_range = 40, #是角度值(在0~180範圍內),表示圖像隨機旋轉的角度範圍。
                                   width_shift_range=0.2, #是圖像在水平方向上平移的範圍(相對於總寬度或總高度的比例)
                                   height_shift_range=0.2, #是圖像在垂直方向上平移的範圍(相對於總寬度或總高度的比例)
                                   shear_range=0.2, #是隨機錯切變換的角度。
                                   zoom_range=0.2, #是圖像隨機縮放的範圍。
                                   horizontal_flip=True, #是隨機將一半圖像水平翻轉。
                                   fill_mode='nearest') #是用於填充新創建像素的方法,這些新像素可能來自於旋轉或寬度/高度平移。
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(train_dir,
                                                    target_size=(150, 150),
                                                    batch_size=20,
                                                    class_mode='binary')

validation_generator = test_datagen.flow_from_directory( validation_dir,
                                                         target_size=(150, 150),
                                                         batch_size=20,
                                                         class_mode='binary')

丟進fit_generator 訓練模型
history = model.fit_generator( train_generator,
                               steps_per_epoch=100,
                               epochs=100,
                               validation_data=validation_generator,
                               validation_steps=50,
                               verbose = 1)

將訓練過程畫出
from matplotlib import pyplot as plt

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()


可以看到驗證精度在80%左右。

在測試數據上驗證精度
test_dir = 'C:\\Users\\Lido\\Downloads\\cats_and_dogs_small\\test'
from keras.preprocessing.image import ImageDataGenerator
test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(test_dir,
                                                  target_size=(150, 150),
                                                  batch_size=20,
                                                  class_mode='binary')

from keras.models import load_model
model = load_model('cats_and_dogs_imagedatagenerator.h5')
model.summary()
test_loss, test_acc = model.evaluate_generator(test_generator, steps=50)
print('test acc:', test_acc)


test acc: 0.8050000047683716

在測試數據也是約80%的精度。

接下來我們使用預訓練模型來讓精度提高。










沒有留言:

張貼留言