Zabraňte nadměrnému vybavení a zvyšte přesnost svého modelu strojového učení implementací metod rozšíření dat TensorFlow.

Rozšiřování dat je proces aplikace různých transformací na trénovací data. Pomáhá zvýšit rozmanitost datové sady a zabránit nadměrnému přizpůsobení. K přemontování většinou dochází, když máte k trénování modelu omezená data.

Zde se dozvíte, jak používat modul pro rozšíření dat TensorFlow k diverzifikaci datové sady. Zabráníte tak nadměrnému přizpůsobení generováním nových datových bodů, které se mírně liší od původních dat.

Vzorová datová sada, kterou budete používat

Budete používat datovou sadu pro kočky a psy Kaggle. Tato datová sada obsahuje přibližně 3000 obrázků koček a psů. Tyto obrázky jsou rozděleny do školicích, testovacích a ověřovacích sad.

Štítek 1.0 představuje psa, zatímco štítek 0.0 představuje kočku.

Úplný zdrojový kód implementující techniky rozšiřování dat a ten, který ne, je dostupný v a úložiště GitHub.

Instalace a import TensorFlow

Chcete-li dokončit, měli byste mít a

instagram viewer
základní porozumění Pythonu. Měli byste mít také základní znalosti strojového učení. Pokud potřebujete opakování, možná budete chtít zvážit následování některých tutoriály o strojovém učení.

OTEVŘENO Google Colab. Změňte typ běhu na GPU. Poté spusťte následující magický příkaz v první buňce kódu a nainstalujte TensorFlow do vašeho prostředí.

!pip install tensorflow

Importujte TensorFlow a jeho příslušné moduly a třídy.

import tensorflow tak jako tf
z tensorflow.keras.preprocessing.image import ImageDataGenerator
z tensorflow.keras.modely import Sekvenční
z tensorflow.keras.vrstvy import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

The tensorflow.keras.preprocessing.image vám umožní provádět rozšíření dat ve vaší datové sadě.

Vytváření instancí třídy ImageDataGenerator

Vytvořte instanci souboru ImageDataGenerator třídy pro údaje o vlaku. Tento objekt použijete pro předzpracování trénovacích dat. Během trénování modelu bude generovat dávky rozšířených obrazových dat v reálném čase.

V úkolu klasifikovat, zda je obrázek kočka nebo pes, můžete použít techniky pro převrácení, náhodnou šířku, náhodnou výšku, náhodný jas a zvětšování dat. Tyto techniky vygenerují nová data, která obsahují variace původních dat reprezentujících scénáře reálného světa.

# definovat generátor obrazových dat pro trénink
train_datagen = ImageDataGenerator (rescale=1./255,
horizontal_flip=Skutečný,
rozsah_shift_shift=0.2,
rozsah_posunu_vysky=0.2,
rozsah_jasu=[0.2,1.0],
rozsah_zoomu=0.2)

Vytvořte další instanci souboru ImageDataGenerator třídy pro testovací data. Budete potřebovat přeškálovat parametr. Bude normalizovat hodnoty pixelů testovacích obrázků tak, aby odpovídaly formátu použitému během tréninku.

# definovat generátor obrazových dat pro testování
test_datagen = ImageDataGenerator (rescale=1./255)

Vytvořte poslední instanci souboru ImageDataGenerator třídy pro ověřovací data. Změňte měřítko ověřovacích dat stejným způsobem jako testovací data.

# definovat generátor obrazových dat pro ověření
validation_datagen = ImageDataGenerator (rescale=1./255)

Na testovací a ověřovací data nemusíte používat jiné techniky rozšíření. Důvodem je to, že model používá testovací a validační data pouze pro účely hodnocení. Měly by odrážet původní rozložení dat.

Načítání dat

Vytvořit DirectoryIterator objekt z adresáře školení. Bude generovat dávky rozšířených obrázků. Poté zadejte adresář, ve kterém jsou uložena trénovací data. Změňte velikost obrázků na pevnou velikost 64x64 pixelů. Zadejte počet obrázků, které každá dávka použije. Nakonec zadejte typ štítku, který má být binární (tedy kočka nebo pes).

# definování adresáře školení
train_data = train_datagen.flow_from_directory (adresář=r'/content/drive/MyDrive/cats_and_dogs_filtred/train',
target_size=(64, 64),
velikost_dávky=32,
class_mode='binární')

Vytvořte další DirectoryIterator objekt z adresáře testování. Nastavte parametry na stejné hodnoty jako u tréninkových dat.

# definování testovacího adresáře
test_data = test_datagen.flow_from_directory (adresář='/content/drive/MyDrive/cats_and_dogs_filtered/test',
target_size=(64, 64),
velikost_dávky=32,
class_mode='binární')

Vytvořte finále DirectoryIterator objekt z ověřovacího adresáře. Parametry zůstávají stejné jako u tréninkových a testovacích dat.

# definování ověřovacího adresáře
validation_data = validation_datagen.flow_from_directory (adresář='/content/drive/MyDrive/cats_and_dogs_filtred/validation',
target_size=(64, 64),
velikost_dávky=32,
class_mode='binární')

Iterátory adresářů nerozšiřují ověřovací a testovací datové sady.

Definování vašeho modelu

Definujte architekturu vaší neuronové sítě. Použijte a Konvoluční neuronová síť (CNN). CNN jsou navrženy tak, aby rozpoznávaly vzory a prvky v obrázcích.

model = sekvenční()

# konvoluční vrstva s 32 filtry o velikosti 3x3
model.add (Conv2D(32, (3, 3), aktivace='relu', input_shape=(64, 64, 3)))

# max. sdružovací vrstva s velikostí bazénu 2x2
model.add (MaxPooling2D(velikost_poolu=(2, 2)))

# konvoluční vrstva s 64 filtry o velikosti 3x3
model.add (Conv2D(64, (3, 3), aktivace='relu'))

# max. sdružovací vrstva s velikostí bazénu 2x2
model.add (MaxPooling2D(velikost_poolu=(2, 2)))

# zploštit výstup z konvolučních a sdružovacích vrstev
model.add (Flatten())

# plně propojená vrstva se 128 jednotkami a aktivací ReLU
model.add (Hustý(128, aktivace='relu'))

# náhodně vynechejte 50 % jednotek, abyste zabránili přemontování
model.add (Dropout(0.5))

# výstupní vrstva s aktivací sigmoidu (binární klasifikace)
model.add (Hustý(1, aktivace='esovitá'))

Zkompilujte model pomocí binárního kódu křížová entropie ztrátová funkce. Binární klasifikační problémy běžně používají It. Pro optimalizaci použijte Adam optimalizátor. Je to adaptivní algoritmus optimalizace rychlosti učení. Nakonec zhodnoťte model z hlediska přesnosti.

model.compile (ztráta='binary_crossentropy', optimalizátor='adam', metriky=['přesnost'])

Vytiskněte souhrn architektury modelu na konzoli.

model.summary()

Následující snímek obrazovky ukazuje vizualizaci architektury modelu.

Získáte tak přehled o tom, jak vypadá návrh vašeho modelu.

Školení vašeho modelu

Trénujte model pomocí vejít se() metoda. Nastavte počet kroků na epochu tak, aby byl počet trénovacích vzorků dělený objem várky. Nastavte také ověřovací data a počet ověřovacích kroků.

# Trénujte model na trénovacích datech
historie = model.fit (data_vlaku,
steps_per_epoch=train_data.n // train_data.batch_size,
epochy =50,
validation_data=validation_data,
validation_steps=validation_data.n // validation_data.batch_size)

The ImageDataGenerator třída aplikuje augmentaci dat na trénovací data v reálném čase. Tím je trénovací proces modelu pomalejší.

Hodnocení vašeho modelu

Vyhodnoťte výkon svého modelu na testovacích datech pomocí vyhodnotit() metoda. Vytiskněte také ztrátu a přesnost testu na konzolu.

test_loss, test_acc = model.evaluate (test_data,
steps=test_data.n // test_data.batch_size)
tisk(f'Test ztráta: {test_loss}')
tisk(f'Přesnost testu: {test_acc}')

Následující snímek obrazovky ukazuje výkon modelu.

Model funguje poměrně dobře na nikdy neviděných datech.

Když spustíte kód, který neimplementuje techniky rozšiřování dat, přesnost trénování modelu je 1. Což znamená, že se přetahuje. Má také špatný výkon na datech, která nikdy předtím neviděl. Je to proto, že se učí zvláštnosti datové sady.

Kdy není rozšíření dat užitečné?

  • Když už je datová sada různorodá a velká: Rozšíření dat zvyšuje velikost a rozmanitost datové sady. Pokud je datová sada již velká a různorodá, nebude rozšíření dat užitečné.
  • Když je datová sada příliš malá: Rozšíření dat nemůže vytvářet nové funkce, které nejsou přítomny v původní datové sadě. Proto nemůže kompenzovat malou datovou sadu, která postrádá většinu funkcí, které se model potřebuje naučit.
  • Když je typ rozšíření dat nevhodný: Například otáčení obrázků nemusí být užitečné tam, kde je důležitá orientace objektů.

Co je TensorFlow schopen

TensorFlow je rozmanitá a výkonná knihovna. Je schopen trénovat komplexní modely hlubokého učení a může běžet na řadě zařízení od chytrých telefonů po clustery serverů. Pomohlo to napájet okrajová výpočetní zařízení, která využívají strojové učení.