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()
因爲沒有調參數,通過打印出的圖片可以發現過擬合了