訂閱
糾錯
加入自媒體

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

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

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

狗與貓的預(yù)測問題本教程的主要目標(biāo)是開發(fā)一個可以識別貓狗圖像的系統(tǒng)。分析輸入圖像,然后預(yù)測輸出。實(shí)現(xiàn)的模型可以根據(jù)需要擴(kuò)展到網(wǎ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 [圖像被讀取并存儲在 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 模型——需要一個模型來正確預(yù)測TensorFlow Keras 層——每個 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)重矩陣的幫助下處理圖像。它們檢測垂直和水平邊緣等低級特征。通過每一層,過濾器識別高級特征。我們首先初始化CNN,#initializing the cnn
classifier=Sequential()

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

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

圖像增強(qiáng)是一種將不同類型的變換應(yī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)入這個類并創(chuàng)建一個生成器的實(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)重數(shù)組之間執(zhí)行的。過濾器總是小于輸入數(shù)據(jù),并且在輸入和過濾器數(shù)組之間執(zhí)行點(diǎn)積。

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

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

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

全連接最終池化層的輸出是扁平化的全連接層的輸入。全連接過程的實(shí)際工作方式如下:全連接層中的神經(jīng)元檢測某個特征并保留其值,然后將該值傳達(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)練集。這需要一些時間才能完成。classifier.fit_generator(training_set,samples_per_epoch=8000,nb_epoch=25,validation_data=test_set,nb_val_samples=2000)

可以看出,我們在訓(xùn)練集上的準(zhǔn)確度為 0.8115。我們可以通過 predict_image 函數(shù)使用我們的模型預(yù)測新圖像,其中我們必須提供新圖像的路徑作為圖像路徑并使用 predict 方法。如果概率大于 0.5,則圖像將被預(yù)測為狗,否則為貓。#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)

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

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

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

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

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

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

暫無評論

暫無評論

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

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