Spriječite prekomjerno opremanje i povećajte točnost modela strojnog učenja implementacijom TensorFlowovih metoda povećanja podataka.

Povećanje podataka je proces primjene različitih transformacija na podatke za obuku. Pomaže povećati raznolikost skupa podataka i spriječiti prekomjerno opremanje. Prekomjerno opremanje se uglavnom događa kada imate ograničene podatke za treniranje svog modela.

Ovdje ćete naučiti kako koristiti TensorFlowov modul za povećanje podataka da biste diverzificirali svoj skup podataka. To će spriječiti prekomjerno prilagođavanje generiranjem novih podatkovnih točaka koje se malo razlikuju od izvornih podataka.

Uzorak skupa podataka koji ćete koristiti

Koristit ćete skup podataka o mačkama i psima iz Kaggle. Ovaj skup podataka sadrži približno 3000 slika mačaka i pasa. Ove su slike podijeljene na skupove za obuku, testiranje i validaciju.

Oznaka 1.0 predstavlja psa dok oznaka 0.0 predstavlja mačku.

Potpuni izvorni kod koji implementira tehnike povećanja podataka i onaj koji nije dostupan dostupni su u a GitHub spremište.

instagram viewer

Instaliranje i uvoz TensorFlow-a

Da biste ga slijedili, trebali biste imati a osnovno razumijevanje Pythona. Također biste trebali imati osnovno znanje o strojnom učenju. Ako trebate osvježenje, razmislite o tome da ih slijedite tutoriali o strojnom učenju.

Otvoren Google Colab. Promijenite vrstu vremena izvođenja u GPU. Zatim izvršite sljedeću čarobnu naredbu na prvoj ćeliji koda da biste instalirali TensorFlow u svoje okruženje.

!pip instalirajte tensorflow

Uvezite TensorFlow i njegove relevantne module i klase.

uvoz tenzorski tok kao tf
iz tensorflow.keras.pretprocessing.image uvoz ImageDataGenerator
iz tensorflow.keras.modeli uvoz Sekvencijalno
iz tensorflow.keras.slojevi uvoz Conv2D, MaxPooling2D, Flatten, Dense, Dropout

The tensorflow.keras.pretprocessing.image omogućit će vam izvođenje povećanja podataka na vašem skupu podataka.

Stvaranje instanci klase ImageDataGenerator

Stvorite instancu ImageDataGenerator razred za podatke o vlaku. Ovaj ćete objekt koristiti za prethodnu obradu podataka o obuci. Generirati će serije podataka proširene slike u stvarnom vremenu tijekom obuke modela.

U zadatku klasificiranja je li slika mačka ili pas, možete koristiti tehnike povećanja podataka okretanja, nasumične širine, nasumične visine, nasumične svjetline i zumiranja. Ove će tehnike generirati nove podatke koji sadrže varijacije izvornih podataka koji predstavljaju scenarije iz stvarnog svijeta.

# definirajte generator slikovnih podataka za obuku
train_datagen = ImageDataGenerator (rescale=1./255,
vodoravni_okret=Pravi,
širina_pomaka_raspona=0.2,
raspon_pomaka_visine=0.2,
raspon_svjetline=[0.2,1.0],
raspon_zuma=0.2)

Stvorite drugu instancu ImageDataGenerator klasa za testne podatke. Trebat će vam ponovno mjeriti parametar. Normalizirat će vrijednosti piksela testnih slika kako bi odgovarale formatu korištenom tijekom obuke.

# definirajte generator slikovnih podataka za testiranje
test_datagen = ImageDataGenerator (rescale=1./255)

Stvorite konačnu instancu ImageDataGenerator klase za podatke o validaciji. Ponovno skalirajte validacijske podatke na isti način kao i testne podatke.

# definirajte generator slikovnih podataka za provjeru valjanosti
validation_datagen = ImageDataGenerator (rescale=1./255)

Ne morate primijeniti druge tehnike povećanja na testne i validacijske podatke. To je zato što model koristi testne i validacijske podatke samo u svrhe evaluacije. Oni bi trebali odražavati izvornu distribuciju podataka.

Učitavanje vaših podataka

Stvoriti Iterator imenika objekt iz imenika obuke. Generirati će serije proširenih slika. Zatim odredite direktorij koji pohranjuje podatke o vježbanju. Promijenite veličinu slika na fiksnu veličinu od 64x64 piksela. Odredite broj slika koje će svaka skupina koristiti. Na kraju, odredite vrstu oznake binarni (tj. mačka ili pas).

# definiranje imenika obuke
train_data = train_datagen.flow_from_directory (directory=r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
target_size=(64, 64),
veličina_serije=32,
class_mode='binarni')

Stvorite drugu Iterator imenika objekt iz direktorija za testiranje. Postavite parametre na iste vrijednosti kao one za podatke o vježbanju.

# definiranje direktorija za testiranje
test_podaci = test_datagen.flow_from_directory (directory='/content/drive/MyDrive/cats_and_dogs_filtered/test',
target_size=(64, 64),
veličina_serije=32,
class_mode='binarni')

Stvorite finale Iterator imenika objekt iz validacijskog direktorija. Parametri ostaju isti kao oni podataka o obuci i testiranju.

# definiranje validacijskog direktorija
validation_data = validation_datagen.flow_from_directory (directory='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
target_size=(64, 64),
veličina_serije=32,
class_mode='binarni')

Iteratori direktorija ne proširuju validacijske i testne skupove podataka.

Definiranje vašeg modela

Definirajte arhitekturu vaše neuronske mreže. Koristi Konvolucijska neuronska mreža (CNN). CNN-ovi su dizajnirani za prepoznavanje uzoraka i značajki na slikama.

model = Sequential()

# konvolucijski sloj s 32 filtera veličine 3x3
model.add (Conv2D(32, (3, 3), aktivacija='relu', input_shape=(64, 64, 3)))

# maksimalni sloj za udruživanje s veličinom bazena 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))

# konvolucijski sloj sa 64 filtera veličine 3x3
model.add (Conv2D(64, (3, 3), aktivacija='relu'))

# maksimalni sloj za udruživanje s veličinom bazena 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))

# poravnati izlaz iz konvolucijskih i skupnih slojeva
model.add (Spljošti())

# potpuno povezani sloj sa 128 jedinica i ReLU aktivacijom
model.add (Dense(128, aktivacija='relu'))

# nasumično ispustite 50% jedinica kako biste spriječili prekomjerno opremanje
model.add (Ispuštanje(0.5))

# izlazni sloj sa sigmoidnom aktivacijom (binarna klasifikacija)
model.add (Dense(1, aktivacija='sigma'))

Kompajlirajte model koristeći binarno unakrsna entropija funkcija gubitka. Problemi binarne klasifikacije obično koriste It. Za optimizator koristite Adamov optimizator. To je adaptivni algoritam za optimizaciju brzine učenja. Na kraju, procijenite model u smislu točnosti.

model.sastaviti (gubitak='binary_crossentropy', optimizator='Adam', metrika=['točnost'])

Ispišite sažetak arhitekture modela na konzolu.

model.summary()

Sljedeća snimka zaslona prikazuje vizualizaciju arhitekture modela.

To vam daje pregled kako vaš dizajn modela izgleda.

Obuka vašeg modela

Uvježbajte model pomoću odgovara() metoda. Postavite broj koraka po epohi da bude broj uzoraka obuke podijeljen s veličina_serije. Također postavite podatke za provjeru valjanosti i broj koraka za provjeru valjanosti.

# Obučite model na podacima o vježbanju
povijest = model.fit (train_data,
steps_per_epoch=train_data.n // train_data.batch_size,
epohe=50,
validation_data=podaci_validacije,
validation_steps=validation_data.n // validation_data.batch_size)

The ImageDataGenerator klasa primjenjuje povećanje podataka na podatke o obuci u stvarnom vremenu. To čini proces treninga modela sporijim.

Procjena vašeg modela

Procijenite izvedbu svog modela na testnim podacima pomoću procijeniti () metoda. Također, ispišite test gubitka i točnosti na konzolu.

test_loss, test_acc = model.evaluate (test_data,
steps=test_data.n // test_data.batch_size)
ispis(gubitak testa: {test_loss}')
ispis(f'Test točnost: {test_acc}')

Sljedeća snimka zaslona prikazuje performanse modela.

Model radi relativno dobro na nikad viđenim podacima.

Kada pokrenete kod koji ne implementira tehnike povećanja podataka, točnost učenja modela je 1. Što znači da pristaje. Također ima loše rezultate na podacima koje nikada prije nije vidio. To je zato što uči osobitosti skupa podataka.

Kada povećanje podataka nije od pomoći?

  • Kad je skup podataka već raznolik i velik: Povećanje podataka povećava veličinu i raznolikost skupa podataka. Ako je skup podataka već velik i raznolik, povećanje podataka neće biti korisno.
  • Kada je skup podataka premalen: Povećanje podataka ne može stvoriti nove značajke koje nisu prisutne u izvornom skupu podataka. Stoga ne može nadoknaditi mali skup podataka koji nema većinu značajki koje model treba naučiti.
  • Kada je vrsta povećanja podataka neprikladna: Na primjer, rotiranje slika možda neće biti od pomoći tamo gdje je orijentacija objekata važna.

Za što je TensorFlow sposoban

TensorFlow je raznolika i moćna biblioteka. Sposoban je trenirati složene modele dubokog učenja i može raditi na nizu uređaja od pametnih telefona do klastera poslužitelja. Pomogao je naprednim računalnim uređajima koji koriste strojno učenje.