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
)
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.