深度學習 - 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%的精度。
接下來我們使用預訓練模型來讓精度提高。
沒有留言:
張貼留言