Krok za krokem VGG16 provádění v Keras pro začátečníky

VGG16 je konvoluční neuronové sítě (CNN ) architektury, který byl použit vyhrát ILSVR(Imagenet) soutěže v roce 2014. To je považováno za jednu z vynikajících vizionářských modelových architektur. Nejvíce unikátní věc, o VGG16 je, že místo toho, aby velký počet hyper-parametru, který je zaměřen na konvoluční vrstvy 3×3 filtr s krokem 1 a vždy použity stejné polstrování a maxpool vrstva 2×2 filtr z kroku 2. Toto uspořádání konvolucí a max bazénových vrstev důsledně sleduje v celé architektuře. Nakonec má 2 FC (plně připojené vrstvy) následované softmax pro výstup. 16 v VGG16 odkazuje na to má 16 vrstvy, které mají závaží. Tato síť je docela velká síť a má asi 138 milionů (přibližně) parametrů.

Architektura VGG16

Budu realizovat plný VGG16 od nuly v Keras. Tato implementace bude provedena na datovém souboru psů a koček. Datový soubor si můžete stáhnout z níže uvedeného odkazu.

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

Jakmile jste si stáhli obrazy, pak můžete pokračovat s kroky, písemné níže.

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

zde nejprve importuji všechny knihovny, které budu potřebovat k implementaci VGG16. Při vytváření sekvenčního modelu budu používat sekvenční metodu. Sekvenční model znamená, že všechny vrstvy modelu budou uspořádány v pořadí. Zde jsem importoval ImageDataGenerator z keras.předzpracování. Cílem ImageDataGenerator je snadno importovat data se štítky do modelu. Je to velmi užitečná třída, protože má mnoho funkcí pro změnu měřítka, otáčení, přiblížení, převrácení atd. Nejužitečnější věcí na této třídě je, že neovlivňuje data uložená na disku. Tato třída mění data na cestách a předává je modelu.

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))

jsem Tady vytváření a objekt ImageDataGenerator jak pro trénovací a testovací data a absolvování složka, která má vlak data do objektu trdata a podobně absolvování složka, která má testovací data do objektu tsdata. Složky struktury dat bude vypadat takto –

Složka strukturu dat, aby přešel na ImageDataGenerator

ImageDataGenerator bude automaticky označena všechna data uvnitř kočka složce jako kočka a vis-à-vis pro psa složky. Tímto způsobem jsou data snadno připravena k přenosu do neuronové sítě.

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)))

Tady jsem začal s inicializaci modelu zadáním, že model je sekvenční model. Po inicializaci modelu přidám

→ 2 x konvoluční vrstva 64 kanál 3×3 kernal a stejné polstrování

→ 1 x maxpool vrstva 2×2 velikost bazénu a krok 2×2

→ 2 x konvoluční vrstva 128 kanál 3×3 kernal a stejné polstrování

→ 1 x maxpool vrstva 2×2 velikost bazénu a krok 2×2

→ 3 x konvoluční vrstva 256 kanál 3×3 kernal a stejné polstrování

→ 1 x maxpool vrstva 2×2 velikost bazénu a krok 2×2

→ 3 x konvoluční vrstva 512 kanál 3×3 kernal a stejné polstrování

→ 1 x maxpool vrstva 2×2 velikost bazénu a krok 2×2

→ 3 x konvoluční vrstva 512 kanál 3×3 kernal a stejné polstrování

→ 1 x maxpool vrstva 2×2 velikost bazénu a krok 2×2

jsem také přidat relu(Opraveny Lineární Jednotka) aktivace každé vrstvy tak, aby všechny negativní hodnoty nejsou přenášeny do další vrstvy.

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

Po vytvoření všech konvoluce jsem předat data do husté vrstvy, tak na to jsem se rozložit vektor, který vychází z závitů a přidat

→ 1 x Hustou vrstvu 4096 jednotek,

→ 1 x Hustou vrstvu 4096 jednotek,

→ 1 x Hustý Softmax vrstva 2 jednotky

Budu používat RELU aktivace pro obě hustou vrstvu 4096 jednotek tak, že jsem se zastavit přesměrování záporné hodnoty prostřednictvím sítě. Na konci používám hustou vrstvu 2 s aktivací softmax, protože mám třídy 2, které lze na konci předpovědět, což jsou pes a kočka. Vrstva softmax zobrazí hodnotu mezi 0 a 1 na základě důvěry modelu, do které třídy obrázky patří.

po vytvoření softmax vrstvy je model konečně připraven. Teď musím sestavit model.

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

zde budu používat Adam optimiser k dosažení globálního minima při tréninku modelu. Pokud se při tréninku zaseknu v místních minimech, pak nám adam optimiser pomůže dostat se z místních minim a dosáhnout globálních minim. Budeme také specifikovat rychlost učení optimizátoru, zde je v tomto případě nastavena na 0,001. Pokud náš trénink hodně poskakuje na epochách, musíme snížit míru učení, abychom mohli dosáhnout globálních minim.

mohu zkontrolovat souhrn modelu, který jsem vytvořil pomocí níže uvedeného kódu.

model.summary()

výstupem bude souhrn modelu, který jsem právě vytvořil.

Shrnutí model
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=)

Po vytvoření modelu budou importovat ModelCheckpoint a EarlyStopping metoda od keras. Vytvořím objekt obou a předám to jako funkce zpětného volání fit_generator.

ModelCheckpoint nám pomáhá uložit model sledováním konkrétního parametru modelu. V tomto případě sleduji přesnost validace předáním val_acc do ModelCheckpoint. Model bude uložen na disk, pouze pokud je přesnost ověření modelu v aktuální epoše větší než v poslední epoše.

EarlyStopping nám pomáhá zastavit trénink modelu brzy, pokud nedojde ke zvýšení parametru, který jsem nastavil pro sledování v Earlystoppingu. V tomto případě sleduji přesnost ověření předáním val_acc na EarlyStopping. Zde jsem nastavil trpělivost 20 což znamená, že model přestane trénovat, pokud neuvidí žádný nárůst přesnosti ověření 20 epochy.

používám model.fit_generator jak jsem pomocí ImageDataGenerator předat data do modelu. Předám údaje o vlaku a testování do fit_generator. Ve fit_generator steps_per_epoch nastaví velikost dávky pro předání tréninkových dat modelu a validation_steps udělá totéž pro testovací data. Můžete jej vyladit na základě specifikací vašeho systému.

po provedení výše uvedeného řádku se model začne trénovat a začnete vidět přesnost a ztrátu školení/validace.

Školení modelu

Jakmile jste trénoval model můžete vizualizovat vzdělávání/ověření přesnosti a ztráty. Jak jste si možná všimli, procházím výstupem režimu.fit_generator na hist proměnnou. Veškerá přesnost a ztráta školení/validace jsou uloženy v hist a odtud si to vizualizuji.

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()

zde si představím přesnost a ztrátu školení/validace pomocí matplotlib.

školení/ověření přesnosti a ztrátu

Dělat předpovědi na vyškolení model potřebuji načíst nejlepší uloží model a pre-zpracování obrazu a přenést obraz na model pro výstup.

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')

Výstup modelu

Tady jsem nahrál obrázek pomocí image metoda v keras a převeden na numpy pole a přidal další rozměr obrazu k obrazu, pro odpovídající NHWC (Počet, Výška, Šířka, Kanál) formát keras.

Jedná se o kompletní implementaci VGG16 v keras pomocí ImageDataGenerator. Můžeme tento model fungovat pro libovolný počet tříd změnou jednotky z poslední softmax hustou vrstvu na jakékoliv číslo, které chceme na základě tříd, které potřebujeme klasifikovat

Github repo odkaz : https://github.com/1297rohit/VGG16-In-Keras

Pokud máte menší množství dat, pak místo tréninku váš model od nuly, můžete zkusit Převod Učení. Také jsem napsal krok za krokem průvodce pro začátečníky na provádění přenosu učení na VGG16 pomocí Keras. Můžete se na to podívat na : https://medium.com/@1297rohit/transfer-learning-from-scratch-using-keras-339834b153b9

Pokud byste se chtěli dozvědět, krok za krokem o tom, Detekce Obličeje a Uznání od nuly, pak se můžete vydat na můj článek na toto téma na odkaz : https://medium.com/@1297rohit/step-by-step-face-recognition-code-implementation-from-scratch-in-python-cc95fa041120

Užijte si Zařazení !

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.