【實戰演練】機器學習系列03-keras搭建貓狗識別神經網絡

上一篇介紹了keras的安裝與搭建線性迴歸神經網絡,這篇咱們嘗試搭建貓狗識別的神經網絡。python

提早下載貓狗圖片kaggle數據集,下載連接:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data redux

裏面帶有test1.zip與train.zip的壓縮包,其中train裏面的圖片是用於對模型進行訓練的,而test裏面的圖片是用來對模型進行測試的。windows

其中train的圖片,已經對圖片打了標籤,例如貓的是cat.0.jpg,狗的是dog.0.jgp,爲了給神經網絡作有監督式的學習。bash

先將train.zip解壓到c:\data\train\目錄,注意windows的\是不行的,路徑用/或者\\表示。網絡


一、統計圖片類型與數量app

import os
train='C:\\data\\train\\'
dogs=[train+i for i in os.listdir(train) if 'dog' in i]
cats=[train+i for i in os.listdir(train) if 'cat' in i]
print(len(dogs),len(cats))

12500 12500ide

#統計c:\data\train\下面的圖片數量,統計完發現dogs有12500張,cats有12500張。將第一步的代碼保存爲名叫data_process的py文件,方便第二步引用。(若是jupyter notebook是利用anaconda安裝,那麼放到當前用戶的用戶目錄便可c:\users\xxx\)學習

二、分揀圖片測試

自動建立一個叫作mini_trainningdata的文件夾,自動從data\train\裏面選用1000張貓與1000張狗圖片,分別放到c:\mini_trainningdata\train\dogs與cats裏面,而且再選取500張貓,500張狗放到c:\mini_trainningdata\test\dogs與cat裏面。spa

import os
def createDir(path):
    if not os.path.exists(path):
        try:
            os.makedirs(path)
        except:
            print("建立文件夾失敗")
            exit(1)
path="C:/min_trainingdata/"
createDir(path+"train/dogs")
createDir(path+"train/cats")
createDir(path+"test/dogs")
createDir(path+"test/cats")
import data_process as dp
import shutil
for dog,cat in list(zip(dp.dogs,dp.cats))[:1000]:
    shutil.copyfile(dog,path+"train/dogs/"+os.path.basename(dog))
    print(os.path.basename(dog)+"操做成功")
    shutil.copyfile(cat, path + "train/cats/" + os.path.basename(cat))
    print(os.path.basename(cat) + "操做成功")
for dog, cat in list(zip(dp.dogs, dp.cats))[1000:1500]:
    shutil.copyfile(dog, path + "test/dogs/" + os.path.basename(dog))
    print(os.path.basename(dog) + "操做成功")
    shutil.copyfile(cat, path + "test/cats/" + os.path.basename(cat))
    print(os.path.basename(cat) + "操做成功")

三、數據加強

將如下代碼保存爲到c:/users/xxx/catvsdogs/morph.py

from keras.preprocessing.image import ImageDataGenerator
train_dir="c:/mini_trainningdata/train/"
test_dir="c:/mini_trainningdata/test/"
train_pic_gen=ImageDataGenerator(rescale=1./255,rotation_range=20,width_shift_range=0.2,height_shift_range=0.2,
                                 shear_range=0.2,zoom_range=0.5,horizontal_flip=True,fill_mode='nearest')
test_pic_gen=ImageDataGenerator(rescale=1./255)
train_flow=train_pic_gen.flow_from_directory(train_dir,(128,128),batch_size=32,class_mode='binary')
test_flow=test_pic_gen.flow_from_directory(test_dir,(128,128),batch_size=32,class_mode='binary')
# print(train_flow.class_indices)

四、構建與訓練模型

from keras.models import Sequential
from keras.layers import Convolution2D,MaxPool2D,Flatten,Dense,Dropout
from keras.callbacks import TensorBoard
model=Sequential([
    Convolution2D(32,3,3,input_shape=(128,128,3),activation='relu'),
    MaxPool2D(pool_size=(2,2)),
    Convolution2D(64,3,3,input_shape=(128,128,3),activation='relu'),
    MaxPool2D(pool_size=(2,2)),
    Flatten(),
    Dense(64,activation='relu'),
    Dropout(0.5),
    Dense(1,activation='sigmoid')
])
model.summary()
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])
import catvsdogs.morph as morph#引用上文1的數據增長代碼
model.fit_generator(
    morph.train_flow,steps_per_epoch=100,epochs=50,verbose=1,validation_data=morph.test_flow,validation_steps=100,
    callbacks=[TensorBoard(log_dir='./logs/1')]
)
model.save('c:/mini_trainningdata/catdogs_model.h5')

執行後,會發現模型已經啓動而且在訓練。

五、從新加載,繼續訓練

from keras.callbacks import TensorBoard
from keras.models import load_model
model=load_model('c:/mini_trainningdata/catdogs_model.h5')
model.summary()
import catvsdogs.morph as morph
model.fit_generator(
    morph.train_flow,steps_per_epoch=100,epochs=50,verbose=1,validation_data=morph.test_flow,validation_steps=100,
    callbacks=[TensorBoard(log_dir='./logs/2')]
)
model.save('c:/mini_trainningdata/catdogs_model.h5')

六、使用自定義的圖片測試

能夠在pre_x=get_inputs裏面修改成本身路徑與路徑下的圖片進行測試。

咱們pic0~2採用貓,pic3~5採用狗,pic6鱷魚、pic7猴子、pic8鋼鐵俠,分別輸入進行測試。

004.png

下屬代碼須要先安裝opencv-python

pip install opencv-python
from keras import models
import numpy as np
import cv2
def get_inputs(src=[]):
    pre_x = []
    for s in src:
        input = cv2.imread(s)
        input = cv2.resize(input, (128, 128))
        input = cv2.cvtColor(input, cv2.COLOR_BGR2RGB)
        pre_x.append(input)  # input一張圖片
    pre_x = np.array(pre_x) / 255.0
    return pre_x
def put_prey(pre_y,label):
    output=[]
    for y in pre_y:
        if y[0]<0.5:#二分類,此處只用一個神經元輸出
            output.append([label[0],1-y[0]])
        else:
            output.append([label[1], y[0]])
    return output
model=models.load_model('c:/mini_trainningdata/catdogs_model.h5')
pre_x=get_inputs(['C:\\testdata\\pic0.jpg','C:\\testdata\\pic1.jpg','\\testdata\\pic2.jpg',
                  'C:\\testdata\\pic3.jpg','C:\\testdata\\pic4.jpg','C:\\testdata\\pic5.jpg',
                  'C:\\testdata\\pic6.jpg','C:\\testdata\\pic7.jpg','C:\\testdata\\pic8.jpg',
                 ])
pre_y=model.predict(pre_x)
import catvsdogs.morph as mp
output=put_prey(pre_y,list(mp.train_flow.class_indices.keys()))
print(output)

003.png

貌似準確率不是很高,前3只cat只中了2只,而後3只狗只中了1只,最後3只不是的確定沒有辦法中。

相關文章
相關標籤/搜索