Πίνακας περιεχομένων[Κρύβω][Προβολή]
Ο εγκέφαλος είναι συγκρίσιμος με τα νευρωνικά δίκτυα. Αυτή είναι η αναλογία που χρησιμοποιείται συνήθως για να βοηθήσει κάποιον νέο στο θέμα να κατανοήσει τις ιδέες πίσω από τη μηχανική μάθηση και τα τεχνητά νευρωνικά δίκτυα.
Επειδή υπάρχουν πολλά επίπεδα μαθηματικών και στατιστικών υπολογισμών που συμβαίνουν στα παρασκήνια, ο ορισμός αυτών των δικτύων ως μαθηματική συνάρτηση είναι μια πιο προηγμένη μέθοδος.
Αυτό είναι για τους ανθρώπους που ενδιαφέρονται πραγματικά για τη μηχανική μάθηση και θέλουν να δουν πώς γράφεται ο κώδικας νευρωνικών δικτύων Python.
Σε αυτό το άρθρο, θα δείξουμε πώς να κατασκευάσετε ένα πλήρως συνδεδεμένο βαθύ νευρωνικό δίκτυο (DNN) από την αρχή. Python 3.
Μια επισκόπηση της δομής του αρχείου για τον κώδικα του νευρωνικού δικτύου Python μας
Θα δημιουργηθούν τρία αρχεία εδώ. Το πρώτο είναι το απλό αρχείο nn.py, το οποίο θα συζητηθεί στα "Ρύθμιση βοηθητικών λειτουργιών" και "Δημιουργία του νευρωνικού δικτύου από την αρχή".
Θα έχουμε επίσης ένα αρχείο με το όνομα mnist loader.py για τη φόρτωση των δεδομένων δοκιμής, όπως περιγράφεται στην ενότητα "Φόρτωση δεδομένων MNIST".
Τέλος, θα έχουμε ένα αρχείο με το όνομα test.py που θα εκκινηθεί στο τερματικό για να ελέγξουμε το νευρωνικό μας δίκτυο.
Αυτό το αρχείο περιγράφεται λεπτομερώς στην ενότητα "Εκτέλεση δοκιμών".
Εγκατάσταση
Πρέπει να γίνει λήψη της βιβλιοθήκης NumPy Python για να ακολουθήσετε αυτό το σεμινάριο. Μπορείτε να το πραγματοποιήσετε χρησιμοποιώντας την ακόλουθη εντολή στο τερματικό:
Εισαγωγή μονάδων και ρύθμιση της λειτουργίας Helper
Οι μόνες δύο βιβλιοθήκες που χρειαζόμαστε είναι η τυχαία και η NumPy, τις οποίες θα εισαγάγουμε αμέσως. Για τα αρχικά βάρη του νευρωνικού μας δικτύου, θα τα ανακατέψουμε χρησιμοποιώντας την τυχαία βιβλιοθήκη.
Για να επιταχύνουμε τους υπολογισμούς μας, θα χρησιμοποιήσουμε NumPy ή np (κατά σύμβαση, συχνά εισάγεται ως np). Οι δύο βοηθητικές μας λειτουργίες θα γίνουν μετά τις εισαγωγές μας. Δύο σιγμοειδείς συναρτήσεις: μία και σιγμοειδής πρώτος.
Η λογιστική παλινδρόμηση θα ταξινομήσει δεδομένα χρησιμοποιώντας τη συνάρτηση σιγμοειδούς, ενώ η οπίσθια διάδοση θα υπολογίσει το δέλτα ή την κλίση χρησιμοποιώντας τη συνάρτηση σιγμοειδούς πρώτης.
Δημιουργία κλάσης δικτύου
Η δημιουργία ενός πλήρως συνδεδεμένου νευρωνικού δικτύου είναι το μόνο επίκεντρο αυτής της ενότητας. Η κλάση δικτύου θα περιλαμβάνει όλες τις συναρτήσεις που ακολουθούν. Η συνάρτηση Object() { [native code] } θα δημιουργηθεί αρχικά στην κλάση δικτύου μας.
Ένα όρισμα, τα μεγέθη, απαιτείται από τη συνάρτηση Object() { [εγγενής κώδικας] }. Η μεταβλητή μεγέθη είναι μια συλλογή αριθμητικών τιμών που αντιπροσωπεύει τον αριθμό των κόμβων εισόδου που υπάρχουν σε κάθε επίπεδο του νευρωνικού μας δικτύου.
Αρχικοποιούμε τέσσερις ιδιότητες στη μέθοδο __init__. Οι μεταβλητές εισόδου, μεγέθη, χρησιμοποιούνται για τον ορισμό της λίστας μεγεθών επιπέδων και του αριθμού των επιπέδων, num επιπέδων, αντίστοιχα.
Το πρώτο βήμα είναι να αντιστοιχίσουμε τυχαία τις αρχικές προκαταλήψεις του δικτύου μας σε κάθε επίπεδο που ακολουθεί το επίπεδο εισόδου.
Τέλος, κάθε σύνδεσμος μεταξύ των επιπέδων εισόδου και εξόδου δημιουργεί τα βάρη του τυχαία. Το Np.Random.Randn() δίνει ένα τυχαίο δείγμα που προέρχεται από την κανονική κατανομή για το περιβάλλον.
Λειτουργία προώθησης τροφοδοσίας
Σε ένα νευρωνικό δίκτυο, οι πληροφορίες αποστέλλονται προς τα εμπρός από τη συνάρτηση προώθησης. Ένα όρισμα, το a, που υποδεικνύει το τρέχον διάνυσμα ενεργοποίησης, θα απαιτείται από αυτή τη συνάρτηση.
Αυτή η συνάρτηση εκτιμά τις ενεργοποιήσεις σε κάθε επίπεδο επαναλαμβάνοντας όλες τις προκαταλήψεις και τα βάρη στο δίκτυο. Η απάντηση που δίνεται είναι η πρόβλεψη, που είναι οι ενεργοποιήσεις του τελευταίου στρώματος.
Mini-batch Gradient Descent
Το άλογο εργασίας της τάξης Network μας είναι Gradient Descent. Σε αυτήν την έκδοση, χρησιμοποιούμε mini-batch (στοχαστική) gradient descent, μια τροποποιημένη παραλλαγή της gradient descent.
Αυτό υποδηλώνει ότι μια μικρή παρτίδα σημείων δεδομένων θα χρησιμοποιηθεί για την ενημέρωση του μοντέλου μας. Τέσσερα απαιτούμενα και ένα προαιρετικό όρισμα μεταβιβάζονται σε αυτήν τη μέθοδο. Οι τέσσερις απαιτούμενες μεταβλητές είναι το σύνολο δεδομένων εκπαίδευσης, ο αριθμός των εποχών, το μέγεθος των μίνι παρτίδων και ο ρυθμός εκμάθησης (eta).
Τα δεδομένα δοκιμών είναι διαθέσιμα κατόπιν αιτήματος. Θα παράσχουμε δεδομένα δοκιμής όταν τελικά αξιολογήσουμε αυτό το δίκτυο. Ο αριθμός των δειγμάτων σε αυτή τη συνάρτηση ορίζεται αρχικά στο μήκος της λίστας μόλις τα δεδομένα εκπαίδευσης μετατραπούν σε τύπο λίστας.
Εφαρμόζουμε επίσης την ίδια διαδικασία για τη δοκιμή δεδομένων που δίνονται. Αυτό συμβαίνει επειδή αντί να μας επιστρέφονται ως λίστες, είναι πραγματικά συμπιεσμένα από λίστες. Όταν φορτώσουμε τα δείγματα δεδομένων του MNIST αργότερα, θα μάθουμε περισσότερα σχετικά με αυτό.
Εάν μπορούμε να βεβαιωθούμε ότι παρέχουμε και τα δύο είδη δεδομένων ως λίστες, τότε αυτή η χύτευση τύπου δεν είναι απαραίτητα απαραίτητη.
Μόλις έχουμε τα δεδομένα, περνάμε τις εποχές εκπαίδευσης σε βρόχο. Μια περίοδος εκπαίδευσης είναι μόνο ένας γύρος εκπαίδευσης νευρωνικών δικτύων. Πρώτα ανακατεύουμε τα δεδομένα σε κάθε εποχή για να διασφαλίσουμε την τυχαιότητα πριν φτιάξουμε μια λίστα με μίνι παρτίδες.
Η λειτουργία μίνι παρτίδας ενημέρωσης, η οποία συζητείται παρακάτω, θα καλείται για κάθε μίνι παρτίδα. Η ακρίβεια της δοκιμής θα επιστραφεί επίσης εάν τα δεδομένα της δοκιμής είναι διαθέσιμα.
Βοηθητική συνάρτηση παράγωγου κόστους
Ας αναπτύξουμε πρώτα μια βοηθητική συνάρτηση που ονομάζεται παράγωγο κόστους πριν δημιουργήσουμε πραγματικά τον κώδικα backpropagation. Αν κάνουμε λάθος στο επίπεδο εξόδου μας, θα το δείξει η συνάρτηση παράγωγου κόστους.
Απαιτεί δύο εισόδους: τον πίνακα ενεργοποιήσεων εξόδου και τις συντεταγμένες y των αναμενόμενων τιμών εξόδου.
Λειτουργία backpropagation
Το παρόν μας διάνυσμα ενεργοποίησης, η ενεργοποίηση, καθώς και οποιαδήποτε άλλα διανύσματα ενεργοποίησης, ενεργοποιήσεις και z-διανύσματα, zs, πρέπει να ληφθούν όλα υπόψη. Ένα επίπεδο που ονομάζεται στρώμα εισόδου ενεργοποιείται πρώτα.
Θα εξετάσουμε κάθε μεροληψία και βάρος αφού τα τοποθετήσουμε. Κάθε βρόχος περιλαμβάνει τον υπολογισμό του διανύσματος z ως το γινόμενο κουκίδων των βαρών και της ενεργοποίησης, την προσθήκη του στη λίστα των zs, τον επανυπολογισμό της ενεργοποίησης και την προσθήκη της ενημερωμένης ενεργοποίησης στη λίστα των ενεργοποιήσεων.
Τέλος, τα μαθηματικά. Το δέλτα, το οποίο είναι ίσο με το σφάλμα από το προηγούμενο επίπεδο πολλαπλασιασμένο με τον σιγμοειδές πρώτο του τελευταίου στοιχείου των διανυσμάτων zs, υπολογίζεται πριν ξεκινήσουμε το πέρασμά μας προς τα πίσω.
Το τελευταίο στρώμα του nabla b έχει οριστεί να είναι το δέλτα και το τελικό στρώμα του nabla w έχει οριστεί να είναι το γινόμενο κουκίδων του δέλτα και το δεύτερο προς το τελευταίο στρώμα ενεργοποιήσεων (μεταφερθεί έτσι ώστε να μπορούμε πραγματικά να κάνουμε τα μαθηματικά) .
Προχωράμε όπως πριν, ξεκινώντας από το δεύτερο στρώμα και ολοκληρώνοντας με το τελευταίο, και επαναλαμβάνουμε τη διαδικασία αφού ολοκληρώσουμε αυτές τις τελευταίες στρώσεις. Στη συνέχεια, οι νάμπλα επιστρέφονται ως πλειάδα.
Ενημέρωση Mini-batch gradient descent
Η μέθοδος SGD (στοχαστική κλίση κατάβασης) από πριν ενσωματώνει ενημέρωση mini-batch. Δεδομένου ότι χρησιμοποιείται στο SGD, αλλά απαιτεί και backprop, συζήτησα πού να βάλω αυτήν τη λειτουργία.
Τελικά, επέλεξα να το δημοσιεύσω εδώ. Ξεκινά δημιουργώντας 0 διανύσματα των nablas των μεροληψιών και των βαρών, όπως ακριβώς έκανε η συνάρτηση backprop μας.
Απαιτεί τη μίνι παρτίδα και το ρυθμό εκμάθησης eta ως δύο εισόδους. Στη μίνι-παρτίδα, χρησιμοποιούμε στη συνέχεια τη συνάρτηση backprop για να λάβουμε το δέλτα κάθε πίνακα nabla για κάθε είσοδο, x και έξοδο, y. Στη συνέχεια, οι λίστες nabla ενημερώνονται με αυτά τα δέλτα.
Τέλος, χρησιμοποιούμε το ρυθμό εκμάθησης και το nablas για να ενημερώσουμε τα βάρη και τις προκαταλήψεις του δικτύου. Κάθε τιμή ενημερώνεται στην πιο πρόσφατη τιμή, μείον τον ρυθμό εκμάθησης, πολλαπλασιάζεται με το μέγεθος της μίνι παρτίδας και στη συνέχεια προστίθεται στην τιμή nabla.
Αξιολογήστε τη λειτουργία
Η συνάρτηση αξιολόγησης είναι η τελευταία που πρέπει να γράψουμε. Τα δεδομένα δοκιμής είναι η μόνη είσοδος για αυτήν τη λειτουργία. Σε αυτή τη συνάρτηση, συγκρίνουμε μόνο τις εξόδους του δικτύου με το αναμενόμενο αποτέλεσμα, y. Τροφοδοτώντας την είσοδο, x, προς τα εμπρός, προσδιορίζονται οι έξοδοι του δικτύου.
Πλήρης κώδικας
Όταν συνδυάζουμε όλο τον κώδικα, έτσι εμφανίζεται.
Δοκιμές νευρωνικού δικτύου
Φόρτωση δεδομένων MNIST
Η Στοιχεία MNIST είναι σε μορφή .pkl.gz, την οποία θα ανοίξουμε χρησιμοποιώντας GZIP και θα φορτώσουμε με τουρσί. Ας γράψουμε μια γρήγορη μέθοδο για τη φόρτωση αυτών των δεδομένων ως πλειάδα μεγέθους τρία, χωρισμένα σε δεδομένα εκπαίδευσης, επικύρωσης και δοκιμής.
Για να διευκολύνουμε τη διαχείριση των δεδομένων μας, θα γράψουμε μια άλλη συνάρτηση για να κωδικοποιήσουμε το y σε έναν πίνακα 10 στοιχείων. Ο πίνακας θα είναι όλα τα 0 εκτός από το 1 που ταιριάζει με το σωστό ψηφίο της εικόνας.
Θα χρησιμοποιήσουμε τα βασικά δεδομένα φόρτωσης και μια μέθοδο hot encode για να φορτώσουμε τα δεδομένα μας σε αναγνώσιμη μορφή. Θα γραφτεί μια άλλη συνάρτηση που θα μετατρέψει τις τιμές x μας σε μια λίστα μεγέθους 784, που ταιριάζει με τα 784 pixel της εικόνας, και τις τιμές y μας στην ενιαία κωδικοποιημένη διανυσματική μορφή τους.
Στη συνέχεια θα συνδυάσουμε τις τιμές x και y έτσι ώστε ο ένας δείκτης να ταιριάζει με τον άλλο. Αυτό ισχύει για τα σύνολα δεδομένων εκπαίδευσης, επικύρωσης και δοκιμής. Στη συνέχεια επιστρέφουμε τα αλλαγμένα δεδομένα.
Τρέχουσες δοκιμές
Θα δημιουργήσουμε ένα νέο αρχείο που ονομάζεται "mnist loader" που θα εισάγει τόσο το νευρωνικό δίκτυο που δημιουργήσαμε προηγουμένως (απλό nn) όσο και τον φορτωτή συνόλου δεδομένων MNIST πριν ξεκινήσουμε τη δοκιμή.
Σε αυτό το αρχείο, το μόνο που χρειάζεται να κάνουμε είναι να εισαγάγουμε τα δεδομένα, να δημιουργήσουμε ένα δίκτυο με μέγεθος επιπέδου εισόδου 784 και μέγεθος επιπέδου εξόδου 10, να εκτελέσουμε τη συνάρτηση SGD του δικτύου στα δεδομένα εκπαίδευσης και μετά να το δοκιμάσουμε χρησιμοποιώντας τα δεδομένα δοκιμής.
Λάβετε υπόψη ότι για τη λίστα μας με τα επίπεδα εισόδου, δεν έχει καμία διαφορά ποιος από τους αριθμούς είναι μεταξύ 784 και 10. Μπορούμε να αλλάξουμε τα άλλα επίπεδα με όποιον τρόπο θέλουμε. μόνο τα μεγέθη εισόδου και εξόδου είναι σταθερά.
Τρεις στρώσεις δεν είναι απαραίτητες. μπορούμε να χρησιμοποιήσουμε τέσσερα, πέντε ή ακόμα και μόνο δύο. Διασκεδάστε πειραματιζόμενοι με αυτό.
Συμπέρασμα
Εδώ, χρησιμοποιώντας την Python 3, δημιουργούμε ένα νευρωνικό δίκτυο από την αρχή. Μαζί με τα μαθηματικά υψηλού επιπέδου, συζητήσαμε επίσης τις ιδιαιτερότητες της εφαρμογής.
Ξεκινήσαμε με την εφαρμογή βοηθητικών λειτουργιών. Για να λειτουργήσουν οι νευρώνες, οι σιγμοειδείς και σιγμοειδείς πρωταρχικές συναρτήσεις είναι ζωτικής σημασίας. Στη συνέχεια εφαρμόζουμε τη συνάρτηση feedforward, η οποία είναι η θεμελιώδης διαδικασία για την τροφοδοσία δεδομένων στο νευρωνικό δίκτυο.
Στη συνέχεια, δημιουργήσαμε τη συνάρτηση gradient descent στην Python, τη μηχανή που οδηγεί το νευρωνικό μας δίκτυο. Προκειμένου να εντοπίσουμε τα «τοπικά ελάχιστα» και να βελτιστοποιήσουμε τα βάρη και τις προκαταλήψεις τους, το νευρωνικό μας δίκτυο χρησιμοποιεί gradient descent. Δημιουργήσαμε τη συνάρτηση backpropagation χρησιμοποιώντας κλίση κατάβασης.
Με την παροχή ενημερώσεων όταν οι έξοδοι δεν ταιριάζουν με τις κατάλληλες ετικέτες, αυτή η λειτουργία επιτρέπει στο νευρωνικό δίκτυο να "μάθει".
Τέλος, βάζουμε την ολοκαίνουργια Python μας νευρικό σύστημα στη δοκιμή χρησιμοποιώντας το σύνολο δεδομένων MNIST. Όλα λειτουργούσαν ομαλά.
Καλή κωδικοποίηση!
Αφήστε μια απάντηση