Πώς να δημιουργήσετε το δικό σας νευρικό δίκτυο από το μηδέν στο Python. Μελετάμε τα νευρωνικά δίκτυα σε τέσσερα βήματα πώς να γράψουν τεχνητή νοημοσύνη στην Πύθωνα

Αλλά πραγματικά, είναι η επιθυμία να δημιουργήσετε μια τέλεια τεχνητή νοημοσύνη, είτε πρόκειται για ένα μοντέλο παιχνιδιού είτε ένα κινητό πρόγραμμα, έχει έρθει στο μονοπάτι του προγραμματιστή πολλούς από εμάς. Το πρόβλημα είναι ότι πίσω από τους τόνους του εκπαιδευτικού υλικού και η σκληρή πραγματικότητα των πελατών, αυτή είναι η επιθυμία αντικαταστάθηκε από μια απλή επιθυμία για αυτο-ανάπτυξη. Για όσους δεν άρχισαν ποτέ την εκτέλεση των ονείρων των παιδιών, τότε ένας σύντομος οδηγός για να δημιουργήσει ένα πραγματικό τεχνητό μυαλό.

Στάδιο 1. Απογοήτευση

Όταν μιλάμε για τη δημιουργία τουλάχιστον απλών bots, τα μάτια γεμίζουν με λάμψη και εκατοντάδες ιδέες αναβοσβήνουν στο κεφάλι ότι θα πρέπει να είναι σε θέση να κάνει. Ωστόσο, όταν πρόκειται για την εφαρμογή, αποδεικνύεται ότι το κλειδί για την επίλυση του πραγματικού μοντέλου συμπεριφοράς είναι ... Μαθηματικά. Για να είναι λίγο πιο συγκεκριμένα, εδώ είναι ο κατάλογος των διαμερισμάτων που πρέπει να μετατοπιστούν τουλάχιστον στη μορφή της πανεπιστημιακής εκπαίδευσης:

    Γραμμική άλγεβρα;

  • Θεωρία των γραφημάτων ·

    Θεωρία πιθανότητας και μαθηματικών στατιστικών.

Αυτή είναι η επιστημονική κεφαλή, στην οποία θα κατασκευαστεί ο περαιτέρω προγραμματισμός σας. Χωρίς τη γνώση και την κατανόηση αυτής της θεωρίας, όλες οι ιδέες θα σπάσουν γρήγορα την αλληλεπίδραση με ένα άτομο, επειδή το τεχνητό μυαλό δεν είναι στην πραγματικότητα όχι περισσότερο από ένα σύνολο από φόρμουλες.

Στάδιο 2. Έγκριση

Όταν ο ύπνος είναι λίγο πυροβόλησε από τη φοιτητική λογοτεχνία, μπορείτε να αρχίσετε να μαθαίνετε γλώσσες. Δεν αξίζει να σπεύσει το Lisp ή άλλους, πρώτα πρέπει να μάθετε πώς να εργάζεστε με μεταβλητές και ξεκάθαρα κράτη. Όσον αφορά τη γρήγορη μελέτη, και η περαιτέρω ανάπτυξη είναι τέλεια, αλλά γενικά, μπορείτε να λάβετε τη βάση οποιασδήποτε γλώσσας με τις σχετικές βιβλιοθήκες.

Στάδιο 3. Ανάπτυξη

Τώρα πηγαίνετε απευθείας στη θεωρία του AI. Μπορούν να χωριστούν σε 3 κατηγορίες:

    Αδύνατο AI είναι τα bots που βλέπουμε στα παιχνίδια υπολογιστών ή τους συνηθισμένους υγιείς βοηθούς, όπως ο Siri. Αυτοί ή εκτελούν εξαιρετικά εξειδικευμένα καθήκοντα ή είναι ένα μικρό σύμπλεγμα αυτών, και κάθε απρόβλεπτη αλληλεπίδραση τους βάζει σε ένα αδιέξοδο.

    Η ισχυρή AI είναι μηχανήματα των οποίων η νοημοσύνη είναι συγκρίσιμη με τον ανθρώπινο εγκέφαλο. Μέχρι σήμερα, δεν υπάρχουν πραγματικοί εκπρόσωποι αυτής της τάξης, αλλά υπολογιστές, όπως ο Watson είναι πολύ κοντά στην επίτευξη αυτού του στόχου.

    Το τέλειο AI είναι το μέλλον, ένας εγκέφαλος μηχανής που θα υπερβεί τις δυνατότητές μας. Πρόκειται για τον κίνδυνο τέτοιων εξελίξεων που προειδοποιούν ο Stephen Hokking, η μάσκα Elon και ο Franmshis "Terminator".

Φυσικά, θα πρέπει να ξεκινήσετε με τα πιο απλά bots. Για να το κάνετε αυτό, θυμηθείτε το παλιό καλό παιχνίδι "cross-tick-ticks" όταν χρησιμοποιείτε το πεδίο 3x3 και προσπαθήστε να υπολογίσετε τους βασικούς ενεργούς αλγόριθμους: την πιθανότητα νίκης σε περίπτωση πράξεων χωρίς λάθη, τα πιο επιτυχημένα μέρη του Πεδίο για τη θέση του σχήματος, η ανάγκη να μειωθεί το παιχνίδι σε ισοπαλία και ούτω καθεξής.

Όπως καταλάβατε ακόμη και από τα ονόματα, είναι ένα API που θα επιτρέψει πλέον το χρόνο χρόνου να δημιουργήσει κάποια ομοιότητα σοβαρότητας AI.

Στάδιο 5. Εργασία

Τώρα, όταν φανταστείτε σαφώς πώς να δημιουργήσετε και πώς να το χρησιμοποιήσετε, ήρθε η ώρα να αποσύρετε τις γνώσεις σας σε ένα νέο επίπεδο. Πρώτον, αυτό θα απαιτήσει τη μελέτη της πειθαρχίας που ονομάζεται "κατάρτιση μηχανών". Δεύτερον, πρέπει να μάθετε πώς να εργάζεστε με τις σχετικές βιβλιοθήκες της επιλεγμένης γλώσσας προγραμματισμού. Για το Python που θεωρείται από εμάς είναι ο Scikit-Learn, Nltk, Scipy, Pybrain και Nump. Τρίτον, στην ανάπτυξη οπουδήποτε δεν μπορεί να κάνει από

Αυτή τη φορά αποφάσισα να διερευνήσω τα νευρικά δίκτυα. Βασικές δεξιότητες σε αυτό το θέμα ήμουν σε θέση να ξεπεράσω το καλοκαίρι και το φθινόπωρο του 2015. Κάτω από τις βασικές δεξιότητες, εννοώ ότι μπορώ να δημιουργήσω ένα απλό νευρικό δίκτυο από το μηδέν. Παραδείγματα μπορούν να βρεθούν στα αποθετήρια μου στο github. Σε αυτό το άρθρο, θα δώσω μερικές διευκρινίσεις και θα μοιραστώ τους πόρους που μπορεί να σας βοηθήσουν να εξερευνήσετε.

Βήμα 1. Νευρώνες και μέθοδος άμεσης διανομής

Ποιο είναι λοιπόν το "νευρικό δίκτυο"; Ας περιμένουμε με αυτό και πρώτα να ασχοληθεί με έναν νευρώνα.

Ο νευρώνας είναι παρόμοιος με τη λειτουργία: χρειάζονται μερικές τιμές για να εισέλθουν και επιστρέφουν ένα.

Ο παρακάτω κύκλος υποδεικνύει τεχνητό νευρώνα. Λαμβάνει 5 και επιστρέφει 1. Εισάγετε - αυτό είναι το άθροισμα των τριών φρυγανιών που συνδέονται με το νευρώνα (τρία βέλη στα αριστερά).

Στην αριστερή πλευρά της εικόνας βλέπουμε 2 τιμές εισόδου (πράσινο) και μετατόπιση (επισημαίνονται με καφέ).

Τα δεδομένα εισόδου μπορεί να είναι αριθμητικές αναπαραστάσεις δύο διαφορετικών ιδιοτήτων. Για παράδειγμα, κατά τη δημιουργία ενός φίλτρου ανεπιθύμητης αλληλογραφίας, θα μπορούσαν να σημαίνουν την παρουσία περισσότερων από μία λέξης που γράφτηκε με κεφαλαία γράμματα και την παρουσία της λέξης "viagra".

Οι τιμές εισόδου πολλαπλασιάζονται με τα λεγόμενα "βάρη", 7 και 3 (που επισημαίνονται με μπλε χρώμα).

Τώρα διπλώνετε τις ληφθείσες τιμές με την μετατόπιση και λαμβάνουμε έναν αριθμό στην περίπτωσή μας 5 (επισημαίνεται με κόκκινο χρώμα). Αυτή είναι η εισαγωγή του τεχνητού νευρώνα μας.

Στη συνέχεια, ο νευρώνας παράγει κάποιο είδος υπολογισμού και εκδίδει την τιμή εξόδου. Έχουμε 1, επειδή Η στρογγυλεμένη τιμή του Sigmoid στο σημείο 5 είναι 1 (λεπτομερέστερα σχετικά με αυτή τη λειτουργία, ας μιλήσουμε αργότερα).

Εάν ήταν ένα φίλτρο ανεπιθύμητης αλληλογραφίας, η έξοδος του 1 θα σήμαινε ότι το κείμενο επισημάνθηκε με νευρώνα ως spam.

Εικονογράφηση ενός νευρικού δικτύου με τη Wikipedia.

Εάν συνδυάσετε αυτούς τους νευρώνες, τότε πάρτε ένα άμεσα κατανεμημένο νευρικό δίκτυο - η διαδικασία προέρχεται από την είσοδο στην έξοδο, μέσω των νευρώνων που συνδέονται με συνάψεις, όπως στην εικόνα στα αριστερά.

Βήμα 2. Sigmoid

Αφού κοιτάξατε τα μαθήματα από το Welch Labs, μια καλή ιδέα θα είναι εξοικειωμένη με την τέταρτη εβδομάδα της πορείας της μηχανής μάθησης από το Coursera αφιερωμένο στα νευρικά δίκτυα - θα συμβάλει στην κατανόηση των αρχών της δουλειάς τους. Το μάθημα είναι πολύ εμβαδόν στα μαθηματικά και βασίζεται στην οκτάβα, και προτιμώ τον Πύθωνα. Εξαιτίας αυτού, χάσαμε τις ασκήσεις και έμαθα όλες τις απαραίτητες γνώσεις από το βίντεο.

Το Sigmoid εμφανίζει απλά την αξία σας (οριζόντιος άξονας) σε ένα τμήμα από 0 έως 1.

Η πρώτη προτεραιότητα για μένα ήταν η μελέτη του Sigmoid, όπως εμφανίστηκε σε πολλές πτυχές των νευρωνικών δικτύων. Κάτι γι 'αυτήν ήδη γνώριζα από την τρίτη εβδομάδα του παραπάνω πορεία, οπότε αναθεωρήθηκα το βίντεο από εκεί.

Αλλά σε μερικά βίντεο δεν θα φύγουν. Για μια πλήρη κατανόηση, αποφάσισα να κλάψω μόνος μου. Ως εκ τούτου, άρχισα να γράφω την εφαρμογή του αλγορίθμου λογικής παλινδρόμησης (η οποία χρησιμοποιεί το Sigmoid).

Χρειάστηκε όλη την ημέρα, και σχεδόν το αποτέλεσμα ήταν ικανοποιητικό. Αλλά δεν έχει σημασία, επειδή κατάλαβα πώς λειτουργεί όλα. Μπορεί να δει κανείς.

Δεν χρειάζεται να το κάνετε μόνοι σας, επειδή απαιτούνται ειδικές γνώσεις εδώ - το κύριο πράγμα είναι ότι καταλαβαίνετε πώς κανονίζετε το Sigmoid.

Βήμα 3. Μέθοδος αντίστροφης διανομής σφάλματος

Κατανοήστε την αρχή της λειτουργίας του νευρικού δικτύου από την είσοδο στην παραγωγή δεν είναι τόσο δύσκολο. Είναι πολύ πιο δύσκολο να κατανοήσουμε πώς το νευρικό δίκτυο μαθαίνεται σε σύνολα δεδομένων. Η αρχή που χρησιμοποίησε από μένα καλείται

James Loy, Τεχνολογικό Πανεπιστήμιο Τεχνολογίας της Γεωργίας. Οδηγός για αρχάριους, μετά από τα οποία μπορείτε να δημιουργήσετε το δικό σας νευρικό δίκτυο στην Python.

Κίνητρο:Εστιάζοντας στην προσωπική εμπειρία στη μάθηση της βαθιάς κατάρτισης, αποφάσισα να δημιουργήσω ένα νευρικό δίκτυο από το μηδέν χωρίς μια πολύπλοκη βιβλιοθήκη κατάρτισης, όπως για παράδειγμα,. Πιστεύω ότι για τους αρχάριους δεδομένων επιστήμονας, είναι σημαντικό να κατανοήσουμε την εσωτερική δομή του νευρικού δικτύου.

Αυτό το άρθρο περιέχει αυτό που έμαθα, και ελπίζω ότι θα είναι χρήσιμο για εσάς! Άλλα χρήσιμα άρθρα σχετικά με το θέμα:

Τι είναι ένα νευρικό δίκτυο;

Τα περισσότερα άρθρα σχετικά με τα νευρικά δίκτυα πραγματοποιούνται με τους παράλληλους του εγκεφάλου. Είναι ευκολότερο να περιγράψω τα νευρικά δίκτυα ως μαθηματική λειτουργία που εμφανίζει την καθορισμένη είσοδο στο επιθυμητό αποτέλεσμα, δεν παραδίδεται σε λεπτομέρειες.

Τα νευρικά δίκτυα αποτελούνται από τα ακόλουθα συστατικά:

  • στρώμα εισόδου, x
  • αυθαίρετος αριθμός Κρυμμένα στρώματα
  • Στρώμα εξόδου, ŷ
  • σειρά Ζυγίζει και μετατοπίσεις Μεταξύ κάθε στρώματος W. και ΣΙ.
  • Επιλογή Λειτουργίες ενεργοποίησης Για κάθε κρυφό στρώμα σ ; Σε αυτό το έργο, θα χρησιμοποιήσουμε τη λειτουργία ενεργοποίησης Sigmoid.

Το παρακάτω διάγραμμα δείχνει την αρχιτεκτονική ενός νευρικού δικτύου δύο στρώσεων (σημειώστε ότι το επίπεδο εισόδου συνήθως αποκλείεται κατά την καταμέτρηση του αριθμού των στρωμάτων στο νευρικό δίκτυο).

Η δημιουργία μιας τάξης του νευρικού δικτύου στην Python φαίνεται απλή:

Εκπαιδευτικό νευρικό δίκτυο

Παραγωγή ŷ Απλό νευρικό δίκτυο δύο στρώσεων:

Στην παραπάνω εξίσωση, το βάρος W και το Offset B είναι οι μόνες μεταβλητές που επηρεάζουν την έξοδο ŷ.

Φυσικά, οι σωστές τιμές για βάρη και μετατοπίσεις καθορίζουν την ακρίβεια των προβλέψεων. Η διαδικασία των ζυγών εξομάλυνσης και των αντισταθμίσεων από τα δεδομένα εισόδου είναι γνωστή ως η εκπαίδευση του νευρικού δικτύου.

Κάθε επανάληψη της διαδικασίας μάθησης αποτελείται από τα ακόλουθα βήματα

  • Υπολογισμός της προβλεπόμενης εξόδου ŷ που ονομάζεται άμεση διανομή
  • Ενημέρωση βαρών και μετατοπίσεων που ονομάζονται αντίστροφα

Η παρακάτω σειριακή γραφή απεικονίζει τη διαδικασία:

Άμεση διανομή

Όπως έχουμε δει στο διάγραμμα παραπάνω, η άμεση διανομή είναι απλά ένας εύκολος υπολογισμός και για το βασικό νευρικό δίκτυο 2 στρώσεων, η απόσυρση του νευρικού δικτύου δίνεται από τον τύπο:

Ας προσθέσουμε μια άμεση λειτουργία διανομής στον κώδικα μας στο Python-e για να το κάνετε αυτό. Σημειώστε ότι για την απλότητα, πρότειναμε ότι η μετατόπιση είναι ίση με 0.

Ωστόσο, χρειάζεστε έναν τρόπο αξιολόγησης της "ποιότητας" των προβλέψεων μας, δηλαδή, πόσο μακριά είναι οι προβλέψεις μας). Λειτουργία απώλειας Απλά μας επιτρέπει να το κάνουμε.

Λειτουργία απώλειας

Υπάρχουν πολλές διαθέσιμες λειτουργίες απώλειας και η φύση του προβλήματός μας θα πρέπει να μας υπαγορεύσει μια επιλογή μιας λειτουργίας απώλειας. Σε αυτό το έργο, θα χρησιμοποιήσουμε Το άθροισμα των τετραγώνων σφαλμάτων Ως συνάρτηση της απώλειας.

Το ποσό των τετραγώνων σφαλμάτων είναι η μέση διαφορά μεταξύ κάθε προβλεπόμενης και πραγματικής τιμής.

Ο σκοπός της μάθησης είναι να βρούμε ένα σύνολο ζυγών και μετατοπίσεων που ελαχιστοποιούν τη λειτουργία απώλειας.

Αντίστροφη διανομή

Τώρα που μετρήσαμε το σφάλμα πρόβλεψης (απώλεια), πρέπει να βρούμε έναν τρόπο Διάδοση σφάλματος πίσω και να ενημερώσετε τα βάρη και τις αντισταθμίσεις μας.

Για να μάθετε το σωστό ποσό για να προσαρμόσετε τα βάρη και τις μετατοπίσεις, πρέπει να γνωρίζουμε την παράγωγη λειτουργία της απώλειας σε σχέση με τα βάρη και τα αντισταθμίσματα.

Ανάκληση από την ανάλυση που Η λειτουργία παραγώγων είναι μια εφαπτομένη γωνία κλίσης της λειτουργίας.

Εάν έχουμε ένα παράγωγο, τότε μπορούμε απλά να ενημερώσουμε τα βάρη και τις αντισταθμίσεις, να αυξάνονται / μειώνοντας τους (βλ. Διάγραμμα παραπάνω). Ονομάζεται καταγωγή κλίσης.

Ωστόσο, δεν μπορούμε να υπολογίσουμε άμεσα το παράγωγο της λειτουργίας απώλειας σε σχέση με τα βάρη και τις μετατοπίσεις, καθώς η εξίσωση της απώλειας λειτουργίας δεν περιέχει κλίμακες και μετατοπίσεις. Ως εκ τούτου, χρειαζόμαστε έναν κανόνα αλυσίδας για να βοηθήσουμε τον υπολογισμό.

Φούντας! Ήταν δυσκίνητο, αλλά επιτρέπεται να πάρει αυτό που χρειαζόμαστε - ένα παράγωγο (κλίση) των λειτουργιών απώλειας σε σχέση με τα βάρη. Τώρα μπορούμε να προσαρμόσουμε κατάλληλα τα βάρη.

Προσθέστε τη λειτουργία backpropagation στον κώδικα μας στο Python-E:

Έλεγχος του έργου των νευροσετιών

Τώρα που έχουμε τον πλήρη κώδικα μας στο Python-e για να εκτελέσουμε άμεση και αντίστροφη διανομή, ας δούμε το νευρωνικό μας δίκτυο στο παράδειγμα και να δούμε πώς λειτουργεί.


Το τέλειο σύνολο των ζυγών

Το νευρωνικό μας δίκτυο θα πρέπει να διερευνήσει το τέλειο σύνολο ζυγών για την παρουσίαση αυτής της λειτουργίας.

Ας εκπαιδεύσουμε το νευρικό δίκτυο για 1500 επαναλήψεις και να δούμε τι συμβαίνει. Λαμβάνοντας υπόψη το χρονοδιάγραμμα των απωλειών σε αναταραχές που ακολουθούν, μπορούμε σαφώς να δούμε ότι η απώλεια μειωθεί μονοτονικά στο ελάχιστο. Αυτό συμβαδίζει με τον αλγόριθμο της καταγεγραμμένης καταγωγής, το οποίο είπαμε νωρίτερα.

Ας δούμε την τελική πρόβλεψη (παραγωγή) από το νευρικό δίκτυο μετά από 1500 επαναλήψεις.

Τα καταφέραμε!Ο Αλγόριθμος διάδοσης άμεσων και επιστροφών μας έδειξε την επιτυχή λειτουργία του νευρικού δικτύου και οι προβλέψεις συγκλίνουν σε πραγματικές τιμές.

Σημειώστε ότι υπάρχει μια μικρή διαφορά μεταξύ των προβλέψεων και των πραγματικών τιμών. Αυτό είναι επιθυμητό επειδή εμποδίζει καλύτερα το νευρωνικό δίκτυο να γενικεύει τα αόρατα δεδομένα.

Τελικές αντανακλάσεις

Έμαθα πολλά στη διαδικασία της γραφής από το μηδέν το δικό μου νευρικό δίκτυο. Αν και οι βιβλιοθήκες της βαθιάς μάθησης, όπως ο Tensorflow και ο Keras, επιτρέπουν τη δημιουργία βαθιών δικτύων χωρίς πλήρη κατανόηση της εσωτερικής εργασίας του νευρικού δικτύου, θεωρώ ότι ο αρχάριος Data Scientist-Am είναι χρήσιμος για να πάρει βαθύτερη κατανόηση τους.

Επένδυμα πολύ προσωπικό μου χρόνο σε αυτό το έργο, και ελπίζω ότι θα είναι χρήσιμο για εσάς!

Βρισκόμαστε τώρα μια πραγματική έκρηξη νευρωνικών δικτύων. Χρησιμοποιούνται για αναγνώριση, εντοπισμό και επεξεργασία εικόνας. Τα νευρικά δίκτυα είναι ήδη σε θέση να κάνουν πολλά που δεν είναι διαθέσιμα σε ένα άτομο. Είναι απαραίτητο να ενσωματώσετε τον εαυτό σας σε αυτή την περίπτωση! Εξετάστε το δίκτυο νετρονίων το οποίο θα αναγνωρίσει τους αριθμούς στην εικόνα εισόδου. Όλα είναι πολύ απλά: μόνο μία λειτουργία στρώματος και ενεργοποίησης. Δεν θα μας επιτρέψει να αναγνωρίσουμε απολύτως όλες τις δοκιμαστικές εικόνες, αλλά θα αντιμετωπίσουμε τη συντριπτική πλειοψηφία. Ως δεδομένα, θα χρησιμοποιήσουμε την παγκόσμια αναγνώριση στον κόσμο της επιλογής δεδομένων Mnist.

Για να συνεργαστείτε με αυτό στην Python υπάρχει βιβλιοθήκη Python-Mnist. Για να εγκαταστήσετε:

PIP Εγκαταστήστε Python-Mnist

Τώρα μπορούμε να ανεβάσουμε δεδομένα

Από το Mnist Import Mnist Mndata \u003d Mnist ("/ PATH_TO_MNIST_DATA_FOLDER /" TR_IMAGES, TR_LABELS \u003d MNDATA.LOAND_TRAINING () test_images, test_labels \u003d mndata.load_testing ()

Τα αρχεία με τα δεδομένα πρέπει να μεταφορτωθούν ανεξάρτητα και το πρόγραμμα καθορίζει τη διαδρομή προς τον κατάλογο μαζί τους. Τώρα οι μεταβλητές TR_IMAGES και test_images περιέχουν εικόνες για τη δικτύωση και τη δοκιμή κατάλληλα. Και οι μεταβλητές tr_labels και test_labels είναι ετικέτες με τη σωστή ταξινόμηση (δηλ. Στοιχεία από εικόνες). Όλες οι εικόνες είναι το μέγεθος 28x28. Καθορίστε τη μεταβλητή με το μέγεθος.

Img_shape \u003d (28, 28)

Μετατρέπουμε όλα τα δεδομένα στις λογισμικές συστοιχίες και τις εξομάλνουμε (δίνουμε το μέγεθος από -1 έως 1). Αυτό θα αυξήσει την ακρίβεια των υπολογισμών.

Εισαγωγή NUMPY ως NP για i στην περιοχή (0, Len (Test_images)): test_images [i] \u003d np.array (test_images [i]) / 255 για i στην περιοχή (0, len (tr_images)): tr_images [i] \u003d NP.ARRAY (TR_IMAGES [I]) / 255

Σημειώνω ότι παρόλο που οι εικόνες λαμβάνονται για να εκπροσωπήσουν με τη μορφή δισδιάστατης συστοιχίας, θα χρησιμοποιήσουμε ένα μονοδιάστατο, είναι απλούστερο για τον υπολογισμό. Τώρα πρέπει να καταλάβετε "ποιο είναι το νευρικό δίκτυο"! Και αυτό είναι απλώς μια εξίσωση με μεγάλο αριθμό συντελεστών. Έχουμε μια σειρά από 28 * 28 \u003d 784 στοιχεία στην είσοδο και ένα άλλο 784 βάρος για τον προσδιορισμό κάθε ψηφίου. Κατά τη λειτουργία του νευρικού δικτύου, πολλαπλασιάστε τις τιμές των εισόδων βάρους. Διπλωμένα τα δεδομένα και προσθέστε το Offset. Το αποτέλεσμα εφαρμόζεται στη λειτουργία ενεργοποίησης. Στην περίπτωσή μας, θα είναι Relu. Αυτή η λειτουργία είναι μηδέν για όλα τα αρνητικά επιχειρήματα και το επιχείρημα για όλα τα θετικά.

Υπάρχουν ακόμα πολλά χαρακτηριστικά ενεργοποίησης! Αλλά αυτό είναι το πιο εύκολο νευρικό δίκτυο! Ορίζουμε αυτό το χαρακτηριστικό με το Numpy

Def relu (x): επιστροφή np.maximum (x, 0)

Τώρα για να υπολογίσετε την εικόνα στην εικόνα που χρειάζεστε για να υπολογίσετε το αποτέλεσμα για 10 σύνολα συντελεστών.

DEF NN_CULTICAL (IMG): resp \u003d λίστα (εύρος (0, 10)) για i στην περιοχή (0,10): r \u003d w [:, i] * img r \u003d relu (np.sum (r) + b [i] ) Resp [i] \u003d r επιστροφή np.argmax (resp)

Για κάθε σετ, θα έχουμε ένα αποτέλεσμα εξόδου. Η έξοδος με το μεγαλύτερο αποτέλεσμα είναι πιθανότατα ότι υπάρχει ο αριθμός μας.

Σε αυτή την περίπτωση, 7. Αυτό είναι όλο! Αλλά όχι ... γιατί πρέπει να πάρετε αυτούς τους πολύ συντελεστές κάπου. Πρέπει να εκπαιδεύσετε το νευρικό μας δίκτυο. Για να το κάνετε αυτό, χρησιμοποιήστε τη μέθοδο αντίστροφης σφάλματος. Η ουσία του είναι να υπολογίσετε τις εξόδους δικτύου, να τις συγκρίνετε με τη σωστή και στη συνέχεια να αφαιρέσετε από τις αναλογίες τον αριθμό που το αποτέλεσμα είναι σωστό. Πρέπει να θυμόμαστε ότι για τον υπολογισμό αυτών των τιμών απαιτείται παράγωγο της λειτουργίας ενεργοποίησης. Στην περίπτωσή μας, είναι μηδέν για όλους τους αρνητικούς αριθμούς και 1 για όλα τα θετικά. Ορίζουμε τυχαία τους συντελεστές.

W \u003d (2 * np.random.rand (10, 784) - 1) / 10 b \u003d (2 * np.random.rand (10) - 1) / 10 για n στην περιοχή (LEN (TR_IMAGES)): IMG \u003d Tr_images [n] cls \u003d tr_labels [n] # forward propagation resp \u003d np.certos (10, dType \u003d np.float32) για i στην περιοχή (0,10): r \u003d w [i] * img r \u003d relu (np. Sum (R) + B [I]) resp [I] \u003d r resp_cls \u003d np.argmax (resp) resp \u003d np.zeros (10, dType \u003d np.float32) resp \u003d 1,0 #pack διάδοση Truct_resp \u003d np. Zeros ( 10, DTYPE \u003d NP.FLOT32) TRUE_RESP \u003d 1,0 Σφάλμα \u003d resp - True_resp Delta \u003d Σφάλμα * ((resp\u003e \u003d 0) * np.ones (10)) για i στην περιοχή (0,10): W [i] - \u003d np .dot (img, delta [i]) b [i] - \u003d delta [i]

Στη διαδικασία μάθησης, οι συντελεστές θα είναι ελαφρώς παρόμοιοι με τους αριθμούς:

Ελέγξτε την ακρίβεια της εργασίας:

DEF NN_Calculate (IMG): resp \u003d λίστα (εύρος (0, 10)) για i στην περιοχή (0,10): r \u003d w [i] * img r \u003d np.maximum (np.sum (r) + b [i] , 0) #relu resp [i] \u003d r επιστροφή np.argmax (resp) total \u003d len (test_images) valid \u003d 0 μη έγκυρο \u003d για i in range (0, σύνολο): img \u003d test_images [i] Προβλεπόμενο \u003d nn_catulate (img ) True \u003d test_labels [i] Αν πρόβλεψη \u003d\u003d true: έγκυρη \u003d έγκυρη + 1 αλλιώς: invalid.Append (("εικόνα": img, "προβλεπόμενο": προβλεπόμενο, "αληθινό")) Εκτύπωση ("Ακρίβεια () "Μορφή (έγκυρη / σύνολο))

Έχω 88%. Δεν είναι τόσο δροσερό, αλλά πολύ ενδιαφέρον!