上一篇介紹了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鋼鐵俠,分別輸入進行測試。
下屬代碼須要先安裝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)
貌似準確率不是很高,前3只cat只中了2只,而後3只狗只中了1只,最後3只不是的確定沒有辦法中。