lemorzsolódás neurális hálózati réteg Keras magyarázata

a gépi tanulást végül arra használják, hogy megjósolják az eredményeket adott funkciók. Ezért mindent, amit tehetünk, hogy általánosítsuk modellünk teljesítményét, nettó nyereségnek tekintjük. A lemorzsolódás egy olyan technika, amelyet a modell túlzott felszerelésének megakadályozására használnak. A lemorzsolódás úgy működik, hogy véletlenszerűen beállítja a rejtett egységek (a rejtett rétegeket alkotó neuronok) kimenő széleit 0-ra az edzési szakasz minden frissítésekor. Ha megnézi a keras dokumentációját a lemorzsolódási rétegről, látni fog egy linket egy Geoffrey Hinton és barátai által írt fehér könyvhöz, amely a lemorzsolódás mögött álló elméletbe megy.

a folyamatban lévő példában Keras-t fogunk használni egy neurális hálózat felépítéséhez azzal a céllal, hogy felismerjük a kézzel írt számjegyeket.

from keras.datasets import mnist
from matplotlib import pyplot as plt
plt.style.use('dark_background')
from keras.models import Sequential
from keras.layers import Dense, Flatten, Activation, Dropout
from keras.utils import normalize, to_categorical

a Keras segítségével importáljuk az adatokat a programunkba. Az adatok már fel vannak osztva a képzési és tesztelési készletekre.

(X_train, y_train), (X_test, y_test) = mnist.load_data()

nézzük meg, mivel dolgozunk.

plt.imshow(x_train, cmap = plt.cm.binary)
plt.show()

miután befejeztük a modell kiképzését, képesnek kell lennie arra, hogy felismerje az előző képet ötösként.

van egy kis előfeldolgozás, amelyet előzetesen el kell végeznünk. A képpontokat (funkciókat) úgy normalizáljuk, hogy azok 0-tól 1-ig terjedjenek. Ez lehetővé teszi a modell számára, hogy sokkal gyorsabban közelítsen egy megoldás felé. Ezután egy adott minta mindegyik célcímkéjét 1s és 0s tömbvé alakítjuk, ahol az 1-es szám indexe azt a számjegyet jelzi, amelyet a kép képvisel. Ezt azért tesszük, mert különben modellünk A 9-es számjegyet úgy értelmezi, hogy nagyobb prioritású, mint a 3-as szám.

X_train = normalize(X_train, axis=1)
X_test = normalize(X_test, axis=1)
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

lemorzsolódás nélkül

mielőtt egy 2 dimenziós mátrixot betáplálnánk egy neurális hálózatba, egy simító réteget használunk, amely átalakítja azt 1 dimenziós tömbvé azáltal, hogy minden következő sort hozzáfűz az azt megelőző sorhoz. Két rejtett réteget fogunk használni, amelyek egyenként 128 neuronból állnak, és egy kimeneti réteget, amely 10 neuronból áll, mindegyik a 10 lehetséges számjegy egyikéhez. A softmax aktiválási függvény visszaadja annak valószínűségét, hogy egy minta egy adott számjegyet képvisel.

mivel osztályokat próbálunk megjósolni, veszteségfüggvényként kategorikus crossentrópiát használunk. A modell teljesítményét pontossággal mérjük.

model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=
)

az adatok 10% – át félretettük érvényesítésre. Ezt arra fogjuk használni, hogy összehasonlítsuk a modell hajlamát a túlfit-re lemorzsolódással vagy anélkül. A 32-es kötegméret azt jelenti, hogy kiszámítjuk a gradienst, és egy lépést teszünk a gradiens irányába a tanulási aránynak megfelelő nagyságrenddel, miután 32 mintát átadtunk a neurális hálózaton. Ezt összesen 10-szer tesszük, a korszakok száma szerint.

history = model.fit(
X_train,
y_train,
epochs=10,
batch_size=32,
validation_split=0.1,
verbose = 1,
shuffle=True
)

az egyes korszakok képzési és validációs pontosságát a fit függvény által visszaadott History változó segítségével ábrázolhatjuk.

mint látható, lemorzsolódás nélkül az érvényesítési veszteség a harmadik korszak után megszűnik.

As you can see, without dropout, the validation accuracy tends to plateau around the third epoch.

Using this simple model, we still managed to obtain an accuracy of over 97%.

test_loss, test_acc = model.evaluate(X_test, y_test)
test_acc

lemorzsolódás

vita folyik arról, hogy a lemorzsolódást az aktiválási funkció előtt vagy után kell-e elhelyezni. Ökölszabályként helyezze a lemorzsolódást az aktiválás funkció után az összes aktiválási funkcióra, kivéve a relu-t. A 0,5 áthaladásakor minden rejtett egység (neuron) 0-ra van állítva, 0,5 valószínűséggel. Más szavakkal, van egy 50% – os változás, hogy egy adott neuron kimenete 0-ra kényszerül.

ismét, mivel osztályokat próbálunk megjósolni, a kategorikus crossentrópiát használjuk veszteségfüggvényként.

model_dropout.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=
)

a validations split paraméter megadásával a modell elkülöníti a képzési adatok töredékét, és minden korszak végén értékeli a veszteséget és az ezen adatok bármely modellmutatóját. Ha a lemorzsolódás mögött álló előfeltevés fennáll, akkor figyelemre méltó különbséget kell látnunk az érvényesítési pontosságban az előző modellhez képest. A shuffle paraméter minden korszak előtt megkeveri az edzési adatokat.

history_dropout = model_dropout.fit(
X_train,
y_train,
epochs=10,
batch_size=32,
validation_split=0.1,
verbose = 1,
shuffle=True
)

mint látható, az érvényesítési veszteség lényegesen alacsonyabb, mint a szokásos modell használatával.

mint látható, a modell sokkal gyorsabban konvergált, és közel 98% – os pontosságot kapott a validációs halmazon, míg az előző modell a harmadik korszak körül állt.

a tesztkészleten kapott pontosság nem nagyon különbözik a lemorzsolódás nélküli modelltől. Ez minden valószínűség szerint a minták korlátozott számának köszönhető.

test_loss, test_acc = model_dropout.evaluate(X_test, y_test)
test_acc

végső gondolatok

a lemorzsolódás segíthet a modell általánosításában azáltal, hogy véletlenszerűen beállítja az adott Neuron kimenetét 0-ra. Ha a kimenetet 0-ra állítja, a költségfüggvény érzékenyebbé válik a szomszédos idegsejtekre, megváltoztatva a súlyok frissítésének módját a backpropagation folyamata során.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.