使用vgg16遷移學習達成訓練目標-2013kaggle
在深度學習的路上,手寫辨識被稱作深度學習的hello world,那2013年貓狗分類的比賽,也是很多人會遇到的題目,那如何獲得高準確率並且不用很多張圖片呢?
這時候遷移學習(Transfer Learning)就上場了,什麼是遷移學習呢?簡單來說就是拿別人訓練好的模型,把輸出加以修改,來達成你要學習的東西,因此如果你的訓練樣本很少,遷移學習或許是個好選擇。
vgg被用來訓練辨識ImageNet的1000種目標,那我們這次要辨識的目標是貓跟狗,貓跟狗也有在ImageNet的1000種目標裡面,所以很適合用遷移學習來完成。
這次的訓練集為:貓500張,狗500張,這麼少的資料就可以達到90%的準確率
這時候遷移學習(Transfer Learning)就上場了,什麼是遷移學習呢?簡單來說就是拿別人訓練好的模型,把輸出加以修改,來達成你要學習的東西,因此如果你的訓練樣本很少,遷移學習或許是個好選擇。
vgg被用來訓練辨識ImageNet的1000種目標,那我們這次要辨識的目標是貓跟狗,貓跟狗也有在ImageNet的1000種目標裡面,所以很適合用遷移學習來完成。
這次的訓練集為:貓500張,狗500張,這麼少的資料就可以達到90%的準確率
程式碼如下:
from keras import models from keras import layers from keras.applications import VGG16 from keras.preprocessing.image import ImageDataGenerator from keras import optimizers import matplotlib.pyplot as plt train_dir = './data/train/' test_dir = './data/validation/' conv_base=VGG16(weights='imagenet',include_top=False,input_shape=(150,150,3)) #載入VGG16 model = models.Sequential() model.add(conv_base) model.add(layers.Flatten()) model.add(layers.Dense(output_dim = 256, activation = 'relu')) model.add(layers.Dense(output_dim = 1, activation = 'sigmoid')) #Dense輸出有幾個output_dim就要改成那個數字,不過輸出只要不是1,activation(激活函數)就必須修改成softmax conv_base.trainable=True set_trainable=False for layer in conv_base.layers: #解凍block5 if layer.name=='block5_conv1': set_trainable=True if set_trainable: layer.trainable=True else: layer.trainable=False conv_base.summary() #====================================================================================================== train_datagen = ImageDataGenerator(rescale = 1./255, rotation_range=40,#rotation range的作用是用戶指定旋轉角度範圍 shear_range = 0.2, #shear_range就是錯切變換 zoom_range = 0.2,#zoom_range參數可以讓圖片在長或寬的方向進行放大 width_shift_range=0.2,#width_shift_range是水平位置平移 height_shift_range=0.2,#height_shift_range 是上下位置平移 horizontal_flip = True, #horizontal_flip的作用是隨機對圖片執行水平翻轉操作 fill_mode='nearest') #fill_mode為填充模式 train_generator=train_datagen.flow_from_directory(train_dir, target_size=(150, 150), batch_size=20, class_mode = 'binary') #==================================================================================== test_datagen = ImageDataGenerator(rescale = 1./255) validation_generator=test_datagen.flow_from_directory(test_dir, target_size=(150, 150), batch_size=20, class_mode = 'binary') #===================================================================================== model.compile(optimizer = optimizers.RMSprop(lr=1e-5), loss = 'binary_crossentropy', metrics = ['acc']) his=model.fit_generator(train_generator, steps_per_epoch = 50, epochs = 10, #迭代次數 validation_data = validation_generator,#驗證集 validation_steps=50) #*2 #========================================================================================== plt.plot(his.history['acc']) plt.plot(his.history['val_acc']) plt.title('model_accuracy') plt.ylabel('accuracy') plt.xlabel('epoch') plt.legend(['train', 'test'], loc='upper left') plt.show() plt.plot(his.history['loss']) plt.plot(his.history['val_loss']) plt.ylabel('loss') plt.xlabel('epoch') plt.legend(['train', 'test'], loc='upper left') plt.show() #model.save('catanddog2000_vgg16_epochs.50-ferr3conv.h5')
留言
張貼留言