abandon strat de rețea neuronală în Keras explicat

Machine learning este utilizat în cele din urmă pentru a prezice rezultatele dat un set de caracteristici. Prin urmare, orice putem face pentru a generaliza performanța modelului nostru este văzut ca un câștig net. Abandonul este o tehnică utilizată pentru a preveni suprasolicitarea unui model. Abandonul funcționează prin setarea aleatorie a marginilor de ieșire ale unităților ascunse (neuroni care alcătuiesc straturi ascunse) la 0 la fiecare actualizare a fazei de antrenament. Dacă aruncați o privire la documentația Keras pentru stratul de abandon, veți vedea un link către o hârtie albă scrisă de Geoffrey Hinton și prieteni, care intră în teoria din spatele abandonului.

în exemplul următor, vom folosi Keras pentru a construi o rețea neuronală cu scopul de a recunoaște cifrele scrise de mână.

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

folosim Keras pentru a importa datele în programul nostru. Datele sunt deja împărțite în seturi de instruire și testare.

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

Să aruncăm o privire pentru a vedea cu ce lucrăm.

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

după ce am terminat de formare în model, ar trebui să fie în măsură să recunoască imaginea precedentă ca cinci.

există o mică preprocesare pe care trebuie să o efectuăm în prealabil. Normalizăm pixelii (caracteristicile) astfel încât să varieze de la 0 la 1. Acest lucru va permite modelului să convergă către o soluție mult mai rapidă. Apoi, transformăm fiecare dintre etichetele țintă pentru un eșantion dat într-o matrice de 1s și 0s unde indexul numărului 1 indică cifra pe care o reprezintă imaginea. Facem acest lucru pentru că altfel modelul nostru ar interpreta cifra 9 ca având o prioritate mai mare decât numărul 3.

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)

fără abandon

înainte de a alimenta o matrice 2 dimensională într-o rețea neuronală, folosim un strat aplatizat care îl transformă într-o matrice 1 dimensională prin adăugarea fiecărui rând ulterior la cel care a precedat-o. Vom folosi două straturi ascunse formate din 128 de neuroni fiecare și un strat de ieșire format din 10 neuroni, fiecare pentru una din cele 10 cifre posibile. Funcția de activare softmax va returna probabilitatea ca un eșantion să reprezinte o cifră dată.

deoarece încercăm să prezicem clase, folosim crossentropia categorică ca funcție de pierdere. Vom măsura performanța modelului folosind precizia.

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

am pus 10% din date deoparte pentru validare. Vom folosi acest lucru pentru a compara tendința unui model de a se suprapune cu și fără abandon. O dimensiune a lotului de 32 implică faptul că vom calcula gradientul și vom face un pas în direcția gradientului cu o magnitudine egală cu rata de învățare, după ce vom trece 32 de probe prin rețeaua neuronală. Facem acest lucru în total de 10 ori, așa cum este specificat de numărul de epoci.

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

putem trasa exactitățile de instruire și validare la fiecare epocă folosind variabila istoric returnată de funcția fit.

după cum puteți vedea, fără abandon, pierderea de validare încetează să scadă după a treia epocă.

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

abandon

există o dezbatere dacă abandonul ar trebui plasat înainte sau după funcția de activare. De regulă, plasați abandonul după funcția Activare pentru toate funcțiile de activare, altele decât relu. În trecerea 0,5, fiecare unitate ascunsă (neuron) este setată la 0 cu o probabilitate de 0,5. Cu alte cuvinte, există o schimbare de 50% că ieșirea unui neuron dat va fi forțată la 0.

din nou, din moment ce încercăm să prezicem clasele, folosim crossentropia categorică ca funcție de pierdere.

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

prin furnizarea parametrului validations split, modelul va separa o fracțiune din datele de antrenament și va evalua pierderea și orice valori ale modelului pe aceste date la sfârșitul fiecărei epoci. Dacă premisa din spatele abandonului este valabilă, atunci ar trebui să vedem o diferență notabilă în precizia validării în comparație cu modelul anterior. Parametrul shuffle va amesteca datele de antrenament înainte de fiecare epocă.

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

după cum puteți vedea, pierderea de validare este semnificativ mai mică decât cea obținută folosind modelul obișnuit.

după cum puteți vedea, modelul a convergut mult mai rapid și a obținut o precizie de aproape 98% pe setul de validare, în timp ce modelul anterior s-a înregistrat în jurul celei de-a treia epoci.

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

gânduri finale

abandonul poate ajuta un model să generalizeze prin setarea aleatorie a ieșirii pentru un anumit neuron la 0. În setarea ieșirii la 0, funcția cost devine mai sensibilă la neuronii vecini, schimbând modul în care greutățile vor fi actualizate în timpul procesului de backpropagare.

Lasă un răspuns

Adresa ta de email nu va fi publicată.