Modelele din Keras moștenesc din clasa keras.models.Model. Este un container pentru straturi, dar poate include și alte modele ca elemente de construcție. Înainte de a fi instruit sau utilizat pentru predicție, un model Keras trebuie „compilat”, ceea ce implică specificarea funcției de pierdere și a optimizatorului. Am constatat că, pentru a îmbunătăți reutilizarea codului de definiție a modelului, există câteva principii de bază de urmat:

andrey

  • Implementați definițiile modelelor ca funcții luând hiper-parametri ca intrare și returnând un obiect Model.
  • Păstrați definiția modelului separat de compilare și instruire.
  • Faceți ca straturile de nivel superior să fie opționale.
  • Cunoașteți-vă API-ul funcțional Keras.

Nu m-aș aștepta ca cineva să dea acest sfat de la sine înțeles, prin urmare, să trecem la justificarea din spatele fiecărui punct.

Definițiile modelului sunt funcții care iau ca parametri hiper-parametrii¶

Există trei moduri populare de definire a modelelor Keras în cod:

  • Loc aleatoriu aproape de codul de antrenament. Acest lucru este excelent pentru explorare atunci când faci ceva rapid într-un notebook și mai puțin grozav când vrei o bază solidă de cod și artefacte reutilizabile.
  • Înfășurat într-o clasă Python cu constructor și metode. Este o alternativă viabilă, însă nu reușesc să văd cum simplul act de a crea o arhitectură de rețea bazată pe un număr de hiper-parametri merită o clasă. Nu există o stare de păstrat și singurul comportament este să construiești un model.
  • Ca o funcție luând hiper-parametrii modelului (formele de intrare/ieșire, numărul și dimensiunea straturilor, parametrii de regularizare etc.) ca argumente și returnând un obiect Model.

Pachetul keras.applications are o colecție de modele Deep Learning care urmează a treia opțiune.

Vă recomand să aveți cât mai puțini parametri obligatorii și să setați restul la valori implicite sensibile. Acesta este modul în care consider că Keras API este conceput în general, deci este bine să îl extindeți și la codul spațiului utilizatorilor.

Definiți modelul separat de compilare și instruire¶

Argumentul este următorul: având modelul definit separat, putem decide ulterior să îl antrenăm cu un optimizator sau altul, precum și să „înghețăm” părțile modelului.

Să luăm în considerare un exemplu de rețea neuronală de convoluție de bază pentru clasificarea propozițiilor multi-etichetă:

Este frumos, acum ce se întâmplă dacă vrem să înghețăm stratul de încorporare și să folosim un optimizator mai avansat cu o rată de învățare agresivă? O modalitate este de a crea o funcție nouă, cum ar fi simple_cnn_frozen_pretrained_vectors_adam_big_lr - care ar funcționa, dar ar duce la copierea-lipirea definiției modelului. A doua opțiune ar putea fi adăugarea optimizatorului ca parametru de intrare la funcția noastră de producere a modelului, și asta ar funcționa, dar dacă am avea o duzină de astfel de funcții cu diferite arhitecturi de model? O altă modalitate simplă de a-l face să funcționeze este amânarea compilării modelului până când știm efectiv cum vrem să instruim modelul:

Faceți ca straturile de nivel superior să fie opționale¶

Un truc la îndemână din pachetul keras.applications este să adăugați un parametru boolean include_top la funcțiile de definire a modelului. Setarea acestuia la False returnează o rețea fără straturile finale complet conectate, ceea ce permite utilizatorului să adauge straturile proprii. În practică, înseamnă că putem schimba chiar și tipul de problemă, de exemplu de la clasa multi-clasă la clasificarea binară:

Compatibilitate cu împachetările scikit-learn¶

Este dezamăgitor, dar abordarea sugerată cu funcții care returnează modelele fără a le compila mai întâi nu va funcționa cu împachetările Keras scikit-learn, cum ar fi keras.wrappers.scikit_learn.KerasClassifier și keras.wrappers.scikit_learn.KerasRegressor. Documentația precizează în mod clar:

build_fn ar trebui să construiască, să compileze și să returneze un model Keras, care va fi apoi folosit pentru a se potrivi/prevedea.

Și mesajul de eroare pe care îl veți primi dacă încercați este AttributeError: obiectul „Secvențial” nu are atributul „pierdere”. Să aruncăm o funcție magică de ordin superior pentru a o remedia:

introducem o funcție compilată care ia funcția noastră de producere a modelului ca intrare, precum și funcția de pierdere și optimizator și returnează o altă funcție care produce modele compilate. Acesta este un pas înainte, acum metoda de potrivire este mai puțin nefericită. Există încă o mică problemă - nu puteți transmite argumente la build_fn, deoarece funcția compiled_model_fn nu acceptă niciunul. Modulul funcools al lui Python vine în salvare cu funcția sa de împachetare:

funcția noastră de ordin superior compilată devine puțin mai inteligentă, acum știe să producă o funcție care ia aceleași argumente ca argumentul de intrare model_fn .

Este demn de remarcat faptul că începând cu versiunea 2.1.4 Keras scikit-learn wrapper classes funcționează numai cu modele secvențiale, nu puteți trece un model_fn care creează un model API funcțional.

API funcțional Keras¶

Nu pot adăuga nimic la uimitorul ghid API funcțional din documentația oficială Keras, dar îi încurajez pe fiecare utilizator Keras să-l citească.