訂閱
糾錯(cuò)
加入自媒體

一文教你使用CNN的貓狗分類 ?

使用CNN進(jìn)行貓狗分類

卷積神經(jīng)網(wǎng)絡(luò) (CNN) 是一種算法,將圖像作為輸入,然后為圖像的所有方面分配權(quán)重和偏差,從而區(qū)分彼此。神經(jīng)網(wǎng)絡(luò)可以通過使用成批的圖像進(jìn)行訓(xùn)練,每個(gè)圖像都有一個(gè)標(biāo)簽來識(shí)別圖像的真實(shí)性質(zhì)(這里是貓或狗)。一個(gè)批次可以包含十分之幾到數(shù)百個(gè)圖像。對(duì)于每張圖像,將網(wǎng)絡(luò)預(yù)測(cè)與相應(yīng)的現(xiàn)有標(biāo)簽進(jìn)行比較,并評(píng)估整個(gè)批次的網(wǎng)絡(luò)預(yù)測(cè)與真實(shí)值之間的距離。然后,修改網(wǎng)絡(luò)參數(shù)以最小化距離,從而增加網(wǎng)絡(luò)的預(yù)測(cè)能力。類似地,每個(gè)批次的訓(xùn)練過程都是類似的。

狗與貓的預(yù)測(cè)問題本教程的主要目標(biāo)是開發(fā)一個(gè)可以識(shí)別貓狗圖像的系統(tǒng)。分析輸入圖像,然后預(yù)測(cè)輸出。實(shí)現(xiàn)的模型可以根據(jù)需要擴(kuò)展到網(wǎng)站或任何移動(dòng)設(shè)備。Dogs vs Cats 數(shù)據(jù)集可以從 Kaggle 網(wǎng)站下載。該數(shù)據(jù)集包含一組貓和狗的圖像。我們的主要目標(biāo)是讓模型學(xué)習(xí)貓和狗的各種獨(dú)特特征。

一旦模型的訓(xùn)練完成,它將能夠區(qū)分貓和狗的圖像。安裝 Python 3.6 所需的包Numpy -> 1.14.4 [圖像被讀取并存儲(chǔ)在 NumPy 數(shù)組中]TensorFlow -> 1.8.0 [Tensorflow 是 Keras 的后端]Keras -> 2.1.6 [Keras 用于實(shí)現(xiàn)CNN]導(dǎo)入庫NumPy- 用于處理數(shù)組、線性代數(shù)。Pandas – 用于讀/寫數(shù)據(jù)Matplotlib – 顯示圖像TensorFlow Keras 模型——需要一個(gè)模型來正確預(yù)測(cè)TensorFlow Keras 層——每個(gè) NN 都需要層,而 CNN 需要幾層。import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Dense
from keras.layers import Flatten
CNN 在稱為過濾器的權(quán)重矩陣的幫助下處理圖像。它們檢測(cè)垂直和水平邊緣等低級(jí)特征。通過每一層,過濾器識(shí)別高級(jí)特征。我們首先初始化CNN,#initializing the cnn
classifier=Sequential()

為了編譯 CNN,我們使用了 adam 優(yōu)化器。

自適應(yīng)矩估計(jì) (Adam) 是一種用于計(jì)算每個(gè)參數(shù)的單獨(dú)學(xué)習(xí)率的方法。對(duì)于損失函數(shù),我們使用二元交叉熵將類輸出與每個(gè)預(yù)測(cè)概率進(jìn)行比較。然后它根據(jù)與期望值的總距離計(jì)算懲罰分?jǐn)?shù)。

圖像增強(qiáng)是一種將不同類型的變換應(yīng)用于原始圖像的方法,生成同一圖像的多個(gè)變換副本。由于移動(dòng)、旋轉(zhuǎn)、翻轉(zhuǎn)等技術(shù),圖像在某些方面彼此不同。因此,我們使用 Keras ImageDataGenerator 類來增強(qiáng)我們的圖像。

#part2-fitting the cnn to the images
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
                                  shear_range = 0.2,
                                  zoom_range = 0.2,
                                  horizontal_flip = True)
我們需要一種方法將我們的圖像轉(zhuǎn)換為內(nèi)存中的成批數(shù)據(jù)數(shù)組,以便在訓(xùn)練期間將它們饋送到網(wǎng)絡(luò)。ImageDataGenerator 可以很容易地用于此目的。所以,我們導(dǎo)入這個(gè)類并創(chuàng)建一個(gè)生成器的實(shí)例。我們使用 Keras 通過 ImageDataGenerator 類的 flow_from_directory 方法從磁盤檢索圖像。# Generating images for the Test set
test_datagen = ImageDataGenerator(rescale = 1./255)
# Creating training set
training_set = train_datagen.flow_from_directory('C:/Users/khushi shah/AndroidStudioProjects/catanddog/dataset/training_set',
                                                target_size = (64, 64),
                                                batch_size = 32,
                                                class_mode = 'binary')
# Creating the Test set
test_set = test_datagen.flow_from_directory('C:/Users/khushi shah/AndroidStudioProjects/catanddog/dataset/test_set',
                                           target_size = (64, 64),
                                           batch_size = 32,
                                           class_mode = 'binary')

卷積卷積是一種線性運(yùn)算,涉及將權(quán)重與輸入相乘。乘法是在輸入數(shù)據(jù)數(shù)組和稱為過濾器或內(nèi)核的二維權(quán)重?cái)?shù)組之間執(zhí)行的。過濾器總是小于輸入數(shù)據(jù),并且在輸入和過濾器數(shù)組之間執(zhí)行點(diǎn)積。

激活添加激活函數(shù)是為了幫助 ANN 學(xué)習(xí)數(shù)據(jù)中的復(fù)雜模式。激活函數(shù)的主要需要是在神經(jīng)網(wǎng)絡(luò)中加入非線性。

池化池化操作提供空間差異,使系統(tǒng)能夠識(shí)別具有不同外觀的對(duì)象。它涉及在特征圖的每個(gè)通道上添加一個(gè) 2D 過濾器,從而總結(jié)過濾器覆蓋的那個(gè)區(qū)域中的特征。因此,池化基本上有助于減少網(wǎng)絡(luò)中存在的參數(shù)和計(jì)算的數(shù)量。它逐步減小網(wǎng)絡(luò)的空間大小,從而控制過擬合。這一層有兩種操作;平均池化和最大池化。

在這里,我們使用最大池化,根據(jù)其名稱,它只會(huì)從池中取出最大值。借助過濾器在輸入中滑動(dòng),這是可能的,并且在每個(gè)步幅中,最大參數(shù)將被取出,其余參數(shù)將被丟棄。與卷積層不同,池化層不會(huì)修改網(wǎng)絡(luò)的深度。

全連接最終池化層的輸出是扁平化的全連接層的輸入。全連接過程的實(shí)際工作方式如下:全連接層中的神經(jīng)元檢測(cè)某個(gè)特征并保留其值,然后將該值傳達(dá)給狗和貓類,然后他們檢查該特征并確定該特征是否與它們相關(guān)。

#step1-convolution
classifier.a(chǎn)dd(Convolution2D(32,3,3,input_shape=(64,64,3),activation='relu'))
#step2-maxpooling
classifier.a(chǎn)dd(MaxPooling2D(pool_size=(2,2)))
#step3-flattening
classifier.a(chǎn)dd(Flatten())
#step4-fullconnection
classifier.a(chǎn)dd(Dense(output_dim=128,activation='relu'))
classifier.a(chǎn)dd(Dense(output_dim=1,activation='sigmoid'))
我們正在將我們的模型擬合到訓(xùn)練集。這需要一些時(shí)間才能完成。classifier.fit_generator(training_set,samples_per_epoch=8000,nb_epoch=25,validation_data=test_set,nb_val_samples=2000)

可以看出,我們?cè)谟?xùn)練集上的準(zhǔn)確度為 0.8115。我們可以通過 predict_image 函數(shù)使用我們的模型預(yù)測(cè)新圖像,其中我們必須提供新圖像的路徑作為圖像路徑并使用 predict 方法。如果概率大于 0.5,則圖像將被預(yù)測(cè)為狗,否則為貓。#to predict new images
def predict_image(imagepath, classifier):
   predict = image.load_img(imagepath, target_size = (64, 64))  
   predict_modified = image.img_to_array(predict)
   predict_modified = predict_modified / 255
   predict_modified = np.expand_dims(predict_modified, axis = 0)
   result = classifier.predict(predict_modified)
   if result[0][0] >= 0.5:
       prediction = 'dog'
       probability = result[0][0]
       print ("probability = " + str(probability))
   else:
       prediction = 'cat'
       probability = 1 - result[0][0]
       print ("probability = " + str(probability))
       print("Prediction = " + prediction)

提供的功能我們可以測(cè)試我們自己的圖像并驗(yàn)證模型的準(zhǔn)確性。我們可以將代碼直接集成到我們的其他項(xiàng)目中,并且可以擴(kuò)展到網(wǎng)站或移動(dòng)應(yīng)用程序設(shè)備中。只需找到合適的數(shù)據(jù)集,更改數(shù)據(jù)集并相應(yīng)地訓(xùn)練模型,我們就可以將項(xiàng)目擴(kuò)展到不同的實(shí)體。應(yīng)用我們大致了解了如何執(zhí)行圖像分類。該項(xiàng)目的范圍可以進(jìn)一步擴(kuò)展到具有自動(dòng)化范圍的不同行業(yè),只需根據(jù)問題的需要來修改數(shù)據(jù)集。

結(jié)論我希望你現(xiàn)在對(duì)卷積神經(jīng)網(wǎng)絡(luò)有一個(gè)基本的了解,并且可以對(duì)貓和狗的圖像進(jìn)行分類。

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)