implementarea pas cu pas VGG16 în Keras pentru începători

VGG16 este o arhitectură de rețea neurală de convoluție (CNN ) care a fost folosită pentru a câștiga competiția ILSVR(Imagenet) în 2014. Este considerată a fi una dintre arhitectura modelului de viziune excelentă până în prezent. Cel mai unic lucru despre VGG16 este că, în loc să aibă un număr mare de hiper-parametri, s-au concentrat pe a avea straturi de convoluție de filtru 3×3 cu un pas 1 și au folosit întotdeauna același strat de umplutură și maxpool de filtru 2×2 al pasului 2. Rezultă acest aranjament de convoluție și Max pool straturi în mod constant în întreaga arhitectură. În cele din urmă are 2 FC(straturi complet conectate) urmate de un softmax pentru ieșire. 16 în VGG16 se referă la acesta are 16 straturi care au greutăți. Această rețea este o rețea destul de mare și are aproximativ 138 milioane (aprox) parametri.

arhitectura VGG16

voi implementa vgg16 complet de la zero în keras. Această implementare se va face pe setul de date Dogs vs Cats. Puteți descărca setul de date de pe linkul de mai jos.

https://www.kaggle.com/c/dogs-vs-cats/data

după ce ați descărcat imaginile, puteți continua cu pașii de mai jos.

import keras,os
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPool2D , Flatten
from keras.preprocessing.image import ImageDataGenerator
import numpy as np

aici import mai întâi toate bibliotecile de care voi avea nevoie pentru a implementa VGG16. Voi folosi metoda secvențială pe măsură ce creez un model secvențial. Modelul secvențial înseamnă că toate straturile modelului vor fi aranjate în ordine. Aici am importat ImageDataGenerator din keras.preprocesare. Obiectivul ImageDataGenerator este de a importa date cu etichete cu ușurință în model. Este o clasă foarte utilă, deoarece are multe funcții de redimensionare, rotire, zoom, flip etc. Cel mai util lucru despre această clasă este că nu afectează datele stocate pe disc. Această clasă modifică datele din mers în timp ce le transmite modelului.

trdata = ImageDataGenerator()
traindata = trdata.flow_from_directory(directory="data",target_size=(224,224))
tsdata = ImageDataGenerator()
testdata = tsdata.flow_from_directory(directory="test", target_size=(224,224))

aici creez și obiectul ImageDataGenerator atât pentru datele de instruire, cât și pentru testarea și trecerea folderului care are date de tren către obiectul trdata și trecerea similară a folderului care are date de testare către obiectul tsdata. Structura de foldere a datelor va fi după cum urmează –

>

structura folderului de date pentru a trece la imagedatagenerator

imagedatagenerator va eticheta automat toate datele din interiorul cat folder ca cat și vis-XV-vis pentru dog folder. În acest fel, datele sunt ușor pregătite pentru a fi transmise rețelei neuronale.

model = Sequential()model.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(3,3),padding="same", activation="relu"))model.add(Conv2D(filters=64,kernel_size=(3,3),padding="same", activation="relu"))model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))

aici am început cu inițializarea modelului specificând că modelul este un model secvențial. După inițializarea model adaug

→ 2 x convoluție strat de 64 de canale de 3×3 kernal și aceeași umplutură

→ 1 x maxpool strat de 2×2 piscină de dimensiuni și pas 2×2

→ 2 x convoluție strat de 128 canal de 3×3 kernal și aceeași umplutură

→ 1 x maxpool strat de 2×2 piscină de dimensiuni și pas 2×2

→ 3 x convoluție strat de 256 canal de 3×3 kernal și aceeași umplutură

→ 1 x maxpool strat de 2×2 piscină de dimensiuni și pas 2×2

→ 3 x convoluție strat de 512 canal de 3×3 kernal și aceeași umplutură

→ 1 x maxpool strat de 2×2 piscină de dimensiuni și pas 2×2

3 x strat de convoluție de 512 canale de 3×3 kernal și aceeași umplutură

1 x strat maxpool de 2×2 dimensiunea bazinului și pasul 2×2

adaug și activarea relu(unitate liniară rectificată) la fiecare strat, astfel încât toate valorile negative să nu fie transmise la următorul strat.

model.add(Flatten())model.add(Dense(units=4096,activation="relu"))model.add(Dense(units=4096,activation="relu"))model.add(Dense(units=2, activation="softmax"))

după crearea tuturor convoluțiilor, transmit datele către stratul dens pentru a aplatiza vectorul care iese din convoluții și adaug

1 x strat dens de 4096 unități

1 x strat dens de 4096 unități

1 x strat dens de Softmax de 2 unități

voi folosi activarea RELU pentru ambele straturi dense de unități 4096, astfel încât să nu mai redirecționez valori negative prin rețea. Eu folosesc un strat dens 2 unitate în cele din urmă cu activare softmax ca am 2 clase pentru a prezice de la în cele din urmă, care sunt câine și pisică. Stratul softmax va afișa valoarea între 0 și 1 pe baza încrederii modelului din care aparține clasa imaginilor.

după crearea stratului softmax modelul este în cele din urmă pregătit. Acum trebuie să compilez modelul.

from keras.optimizers import Adam
opt = Adam(lr=0.001)model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=)

aici voi folosi Adam optimiser pentru a ajunge la minimele globale în timp ce antrenez modelul. Dacă sunt blocat în minimele locale în timpul antrenamentului, atunci adam optimiser ne va ajuta să ieșim din minimele locale și să atingem minimele globale. De asemenea, vom specifica rata de învățare a optimizatorului, aici în acest caz este setată la 0,001. În cazul în care formarea noastră este viguros mult pe epoci, atunci avem nevoie pentru a reduce rata de învățare, astfel încât să putem ajunge la minimele globale.

pot verifica rezumatul modelului pe care l-am creat folosind codul de mai jos.

model.summary()

rezultatul va fi rezumatul modelului pe care tocmai l-am creat.

Rezumatul modelului

from keras.callbacks import ModelCheckpoint, EarlyStoppingcheckpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)early = EarlyStopping(monitor='val_acc', min_delta=0, patience=20, verbose=1, mode='auto')hist = model.fit_generator(steps_per_epoch=100,generator=traindata, validation_data= testdata, validation_steps=10,epochs=100,callbacks=)

după crearea modelului voi importa metoda modelcheckpoint și earlystopping din keras. Voi crea un obiect de ambele și să treacă ca funcții de apel invers la fit_generator.

ModelCheckpoint ne ajută să salvăm Modelul prin monitorizarea unui parametru specific al modelului. În acest caz, monitorizez acuratețea validării prin trecerea val_acc la ModelCheckpoint. Modelul va fi salvat pe disc numai dacă precizia de validare a modelului în epoca curentă este mai mare decât ceea ce a fost în ultima epocă.

EarlyStopping ne ajută să oprim formarea modelului devreme dacă nu există o creștere a parametrului pe care l-am setat să îl monitorizez în EarlyStopping. În acest caz, monitorizez acuratețea validării prin trecerea val_acc la EarlyStopping. Am stabilit aici răbdarea la 20, ceea ce înseamnă că modelul se va opri pentru a se antrena dacă nu vede nicio creștere a preciziei de validare în epocile 20.

sunt folosind modelul.fit_generator pe măsură ce folosesc ImageDataGenerator pentru a transmite date modelului. Voi trece datele de tren și de testare pentru a fit_generator. În fit_generator steps_per_epoch va seta dimensiunea lotului pentru a transmite datele de antrenament modelului și validation_steps va face același lucru pentru datele de testare. Puteți să-l tweak pe baza specificațiilor sistemului.

după executarea liniei de mai sus, modelul va începe să se antreneze și veți începe să vedeți acuratețea și pierderea antrenamentului / validării.

formarea model

odată ce ați instruit modelul, puteți vizualiza precizia și pierderea antrenamentului / validării. După cum probabil ați observat, trec ieșirea din modul.fit_generator la hist variabilă. Toate precizia de formare / validare și pierderea sunt stocate în hist și voi vizualiza de acolo.

import matplotlib.pyplot as plt
plt.plot(hist.history)
plt.plot(hist.history)
plt.plot(hist.history)
plt.plot(hist.history)
plt.title("model accuracy")
plt.ylabel("Accuracy")
plt.xlabel("Epoch")
plt.legend()
plt.show()

aici voi vizualiza precizia și pierderea antrenamentului / validării folosind matplotlib.

instruire/validare precizie și pierdere

pentru a face predicții pe modelul instruit, trebuie să încarc modelul cel mai bine salvat și să pre-procesez imaginea și să transmit imaginea modelului pentru ieșire.

from keras.preprocessing import imageimg = image.load_img("image.jpeg",target_size=(224,224))
img = np.asarray(img)
plt.imshow(img)
img = np.expand_dims(img, axis=0)from keras.models import load_model
saved_model = load_model("vgg16_1.h5")output = saved_model.predict(img)
if output > output:
print("cat")
else:
print('dog')

ieșirea modelului

aici am încărcat imaginea folosind metoda imaginii în keras și am convertit-o în matrice NumPy și am adăugat o dimensiune suplimentară imaginii în imagine pentru potrivirea formatului nhwc (număr, înălțime, lățime, canal) al keras.

aceasta este o implementare completă a VGG16 în keras folosind ImageDataGenerator. Putem face ca acest model să funcționeze pentru orice număr de clase schimbând unitatea ultimului strat dens softmax la orice număr dorim pe baza claselor pe care trebuie să le clasificăm

GitHub repo link : https://github.com/1297rohit/VGG16-In-Keras

Dacă aveți o cantitate mai mică de date, atunci în loc să vă antrenați modelul de la zero, puteți încerca învățarea prin Transfer. Am scris, de asemenea, un ghid pas cu pas pentru începători cu privire la efectuarea învățării prin transfer pe VGG16 folosind Keras. Puteți verifica la : https://medium.com/@1297rohit/transfer-learning-from-scratch-using-keras-339834b153b9

Dacă doriți să aflați pas cu pas despre detectarea feței și recunoașterea feței de la zero, atunci puteți accesa articolul meu despre acest subiect pe linkul:https://medium.com/@1297rohit/step-by-step-face-recognition-code-implementation-from-scratch-in-python-cc95fa041120

bucurați-vă de clasificare !

Lasă un răspuns

Adresa ta de email nu va fi publicată.