Preprečite prekomerno opremljanje in povečajte natančnost vašega modela strojnega učenja z implementacijo metod povečanja podatkov TensorFlow.
Razširitev podatkov je postopek uporabe različnih transformacij podatkov o usposabljanju. Pomaga povečati raznolikost nabora podatkov in preprečiti prekomerno opremljanje. Prekomerno opremljanje se večinoma zgodi, ko imate omejene podatke za usposabljanje svojega modela.
Tukaj se boste naučili, kako uporabiti modul za povečanje podatkov TensorFlow za diverzifikacijo vašega nabora podatkov. To bo preprečilo prekomerno prilagajanje z ustvarjanjem novih podatkovnih točk, ki se nekoliko razlikujejo od prvotnih podatkov.
Vzorčni nabor podatkov, ki ga boste uporabili
Uporabili boste nabor podatkov o mačkah in psih iz Kaggle. Ta nabor podatkov vsebuje približno 3000 slik mačk in psov. Te slike so razdeljene na sklope za usposabljanje, testiranje in preverjanje.
Oznaka 1.0 predstavlja psa, oznaka 0.0 pa mačko.
Celotna izvorna koda, ki izvaja tehnike povečanja podatkov, in tista, ki je ne izvaja, sta na voljo v a Repozitorij GitHub.
Namestitev in uvoz TensorFlow
Če želite slediti, bi morali imeti a osnovno razumevanje Pythona. Imeti morate tudi osnovno znanje strojnega učenja. Če potrebujete osvežitev, boste morda želeli razmisliti o nekaterih vadnice o strojnem učenju.
Odprto Google Colab. Spremenite vrsto izvajalnega okolja v GPU. Nato izvedite naslednji čarobni ukaz v prvi kodni celici, da namestite TensorFlow v svoje okolje.
!pip namestite tensorflow
Uvozite TensorFlow in njegove ustrezne module ter razrede.
uvoz tenzorski tok kot tf
od tensorflow.keras.preprocessing.image uvoz ImageDataGenerator
od tensorflow.keras.models uvoz Zaporedna
od tensorflow.keras.layers uvoz Conv2D, MaxPooling2D, Flatten, Dense, Dropout
The tensorflow.keras.preprocessing.image vam bo omogočila izvedbo razširitve podatkov na vašem naboru podatkov.
Ustvarjanje primerkov razreda ImageDataGenerator
Ustvarite primerek ImageDataGenerator razreda za podatke o vlaku. Ta objekt boste uporabili za predhodno obdelavo podatkov o usposabljanju. Med usposabljanjem modela bo v realnem času ustvaril serije razširjenih slikovnih podatkov.
Pri nalogi razvrščanja, ali je slika mačka ali pes, lahko uporabite tehnike povečevanja podatkov z obračanjem, naključno širino, naključno višino, naključno svetlostjo in povečavo. Te tehnike bodo ustvarile nove podatke, ki vsebujejo različice izvirnih podatkov, ki predstavljajo scenarije iz resničnega sveta.
# definirajte generator slikovnih podatkov za usposabljanje
train_datagen = ImageDataGenerator (rescale=1./255,
horizontal_flip=Prav,
width_shift_range=0.2,
obseg_premika višine=0.2,
svetlost_razpon=[0.2,1.0],
zoom_range=0.2)
Ustvarite še en primerek ImageDataGenerator razred za testne podatke. Potrebovali boste premeriti parameter. Normaliziral bo vrednosti slikovnih pik testnih slik, da bodo ustrezale formatu, ki je bil uporabljen med usposabljanjem.
# definirajte generator slikovnih podatkov za testiranje
test_datagen = ImageDataGenerator (rescale=1./255)
Ustvari končni primerek ImageDataGenerator razred za validacijske podatke. Podatke o validaciji spremenite na enak način kot testne podatke.
# definirajte generator slikovnih podatkov za validacijo
validation_datagen = ImageDataGenerator (rescale=1./255)
Za testne in validacijske podatke vam ni treba uporabiti drugih tehnik povečanja. To je zato, ker model uporablja testne in validacijske podatke samo za namene vrednotenja. Odražati morajo prvotno porazdelitev podatkov.
Nalaganje vaših podatkov
Ustvariti Iterator imenika predmet iz imenika usposabljanja. Ustvaril bo serije razširjenih slik. Nato določite imenik, v katerem so shranjeni podatki o vadbi. Spremenite velikost slik na fiksno velikost 64x64 slikovnih pik. Določite število slik, ki jih bo uporabil vsak paket. Nazadnje določite vrsto oznake dvojiško (npr. mačka ali pes).
# določitev imenika usposabljanja
train_data = train_datagen.flow_from_directory (imenik=r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
ciljna_velikost=(64, 64),
velikost_serije=32,
class_mode='binarni')
Ustvari drugo Iterator imenika predmet iz testnega imenika. Parametre nastavite na enake vrednosti kot v podatkih o vadbi.
# definiranje testnega imenika
testni_podatki = testni_podatki.tok_iz_imenika (imenik='/content/drive/MyDrive/cats_and_dogs_filtered/test',
ciljna_velikost=(64, 64),
velikost_serije=32,
class_mode='binarni')
Ustvari končno Iterator imenika objekt iz validacijskega imenika. Parametri ostanejo enaki kot pri podatkih o usposabljanju in testiranju.
# definiranje validacijskega imenika
validacijski_podatki = validacijski_datagen.flow_from_directory (directory='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
ciljna_velikost=(64, 64),
velikost_serije=32,
class_mode='binarni')
Iteratorji imenika ne povečajo naborov podatkov za preverjanje veljavnosti in preizkusa.
Definiranje vašega modela
Določite arhitekturo vaše nevronske mreže. Uporabi Konvolucijska nevronska mreža (CNN). CNN so zasnovani za prepoznavanje vzorcev in značilnosti na slikah.
model = Sequential()
# konvolucijski sloj z 32 filtri velikosti 3x3
model.add (Conv2D(32, (3, 3), aktivacija='relu', vhodna_oblika=(64, 64, 3)))# največja plast združevanja z velikostjo bazena 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))# konvolucijski sloj s 64 filtri velikosti 3x3
model.add (Conv2D(64, (3, 3), aktivacija='relu'))# največja plast združevanja z velikostjo bazena 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))# izravnajte izhod iz konvolucijskih in združevalnih plasti
model.add (Flatten())# popolnoma povezana plast s 128 enotami in aktivacijo ReLU
model.add (Gosto(128, aktivacija='relu'))# naključno izpustite 50 % enot, da preprečite prekomerno opremljanje
model.add (Izpad(0.5))
# izhodna plast s sigmoidno aktivacijo (binarna klasifikacija)
model.add (Gosto(1, aktivacija='sigmoid'))
Prevedite model z uporabo binarne datoteke navzkrižna entropija funkcija izgube. Problemi binarne klasifikacije običajno uporabljajo It. Za optimizator uporabite Adamov optimizator. Je prilagodljiv algoritem za optimizacijo stopnje učenja. Na koncu ocenite model z vidika natančnosti.
model.compile (izguba='binary_crossentropy', optimizator='adam', meritve=['natančnost'])
Natisnite povzetek arhitekture modela na konzolo.
model.summary()
Naslednji posnetek zaslona prikazuje vizualizacijo arhitekture modela.
To vam daje pregled nad tem, kako izgleda vaš model.
Usposabljanje vašega modela
Usposobite model z uporabo fit() metoda. Nastavite število korakov na epoho tako, da je število vadbenih vzorcev deljeno z velikost_serije. Prav tako nastavite podatke za preverjanje in število korakov preverjanja.
# Usposabljanje modela na podlagi podatkov o usposabljanju
zgodovina = model.fit (train_data,
steps_per_epoch=train_data.n // train_data.batch_size,
epohe=50,
validation_data=validacijski_podatki,
validation_steps=validation_data.n // validation_data.batch_size)
The ImageDataGenerator razred uporablja povečavo podatkov za podatke o usposabljanju v realnem času. Zaradi tega je proces usposabljanja modela počasnejši.
Ocenjevanje vašega modela
Ocenite delovanje svojega modela na podlagi podatkov o preskusu z uporabo oceni () metoda. Prav tako natisnite izgubo in natančnost testa na konzolo.
test_loss, test_acc = model.evaluate (test_data,
steps=test_data.n // test_data.batch_size)
natisni(f'testna izguba: {test_loss}')
natisni(f'testna natančnost: {test_acc}')
Naslednji posnetek zaslona prikazuje delovanje modela.
Model se razmeroma dobro obnese na nikoli videnih podatkih.
Ko zaženete kodo, ki ne izvaja tehnik povečanja podatkov, je natančnost usposabljanja modela 1. Kar pomeni, da se preveč prilega. Prav tako se slabo obnese pri podatkih, ki jih še nikoli ni videl. To je zato, ker se nauči posebnosti nabora podatkov.
Kdaj povečevanje podatkov ni koristno?
- Ko je nabor podatkov že raznolik in velik: Razširitev podatkov poveča velikost in raznolikost nabora podatkov. Če je nabor podatkov že velik in raznolik, povečanje podatkov ne bo uporabno.
- Ko je nabor podatkov premajhen: Razširitev podatkov ne more ustvariti novih funkcij, ki niso prisotne v izvirnem naboru podatkov. Zato ne more nadomestiti majhnega nabora podatkov, ki nima večine funkcij, ki jih model potrebuje za učenje.
- Ko je vrsta povečevanja podatkov neustrezna: Na primer, vrtenje slik morda ne bo v pomoč, če je orientacija predmetov pomembna.
Česa je sposoben TensorFlow
TensorFlow je raznolika in zmogljiva knjižnica. Sposoben je trenirati kompleksne modele globokega učenja in lahko deluje na različnih napravah, od pametnih telefonov do grozdov strežnikov. Pomagal je zmogljivim računalniškim napravam, ki uporabljajo strojno učenje.