用keras進行貓狗識別(一)

Keras是一個高層神經網絡API,Keras由純Python編寫而成並基Tensorflow、Theano以及CNTK後端。Keras 爲支持快速實驗而生,能夠把你的idea迅速轉換爲結果,如果你有如下需求,請選擇Keras:

  • 簡易和快速的原型設計(keras具有高度模塊化,極簡,和可擴充特性)
  • 支持CNN和RNN,或二者的結合
  • 無縫CPU和GPU切換

對於新手來說,keras可以說是非常的友好,我們不需要大量的代碼,就能實現我們所需要的功能,而且keras案例也比較多,非常適合我們去學習。

作爲在kaggle中遊樂場級的案例(最簡單),而且聽起來也非常有趣,所以我對它下手了。

數據集可以直接去kaggle下載,因爲裏邊的圖片太多了,所以我抽調了一些圖片進行學習
圖片分配方式
訓練集:各1000張
驗證集:各500張
測試集:各500張
代碼直接貼下,因爲基本上每行代碼都寫上了註釋,所以就不過多解釋了,如果哪裏有疑問,也歡迎提出來

from keras import layers
from keras import models
#設置文件目錄
#訓練集
trainDir ='./train/'
trainDogDir = './train/train_dog/'
trainCatDir = './train/train_cat/'
#驗證集
valDir = './check/'
valDogDir = './check/check_dog/'
valCatDir = './check/check_cat/'
#測試集
testDir = './test/'
testDogDir = './test/test_dog/'
testCatDir = './test/test_cat/'

#創建模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
#卷積層,輸出空間的維數爲32,也可以說是輸出特徵圖的深度爲32,提取信息的窗口大小(3,3),卷積核的大小也爲(3,3)
#激活函數relu,輸入圖片大小(150,150,3)
model.add(layers.MaxPooling2D((2, 2)))
#池化層,窗口大小爲(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
#將圖片像素縮小爲[0,1]之間的浮點數
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

#創建圖片生成器
train_generator = train_datagen.flow_from_directory(
 trainDir,#圖片地址
 target_size=(150, 150),#將圖片調整爲(150,150)大小
 batch_size=20,#設置批量數據的大小爲20
 class_mode='binary')#設置返回標籤的類型
val_generator = test_datagen.flow_from_directory(
 valDir,
 target_size=(150, 150),
 batch_size=20,
 class_mode='binary')

#擬合模型
history = model.fit_generator(
  train_generator,
  steps_per_epoch=100,#迭代進入下一輪次需要抽取的批次
  epochs=30,#數據迭代的輪數
  validation_data=val_generator,
  validation_steps=50)#驗證集用於評估的批次

#保存模型
model.save('cats_and_dogs_small_1.h5')


#畫出結果
import matplotlib.pyplot as plt

#查看變量,發現history.history中就只有這四個值,分別是準確度,驗證集準確度,損失,驗證集損失
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.figure(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.savefig('acc.png')
plt.show()
#損失
plt.figure(2)
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.savefig('loss.png')
plt.show()

在這裏插入圖片描述
在這裏插入圖片描述
因爲沒有調參數,通過打印出的圖片可以發現過擬合了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章