Ταξινόμηση εικόνων CNN στο TensorFlow με βήματα και παραδείγματα
Τι είναι το Συνελικτικό Νευρωνικό Δίκτυο;
Συγκροτητικό νευρικό δίκτυο, γνωστό και ως convnets ή CNN, είναι μια πολύ γνωστή μέθοδος στις εφαρμογές όρασης υπολογιστών. Είναι μια κατηγορία βαθιών νευρωνικών δικτύων που χρησιμοποιούνται για την ανάλυση οπτικών εικόνων. Αυτός ο τύπος αρχιτεκτονικής είναι κυρίαρχος για την αναγνώριση αντικειμένων από μια εικόνα ή ένα βίντεο. Χρησιμοποιείται σε εφαρμογές όπως η αναγνώριση εικόνας ή βίντεο, η επεξεργασία νευρωνικής γλώσσας κ.λπ.
Archiδομή ενός συνελικτικού νευρωνικού δικτύου
Σκεφτείτε το Facebook πριν από μερικά χρόνια, αφού ανεβάσατε μια φωτογραφία στο προφίλ σας, σας ζητήθηκε να προσθέσετε ένα όνομα στο πρόσωπο στην εικόνα με μη αυτόματο τρόπο. Σήμερα, το Facebook χρησιμοποιεί το convnet για να επισημαίνει αυτόματα τον φίλο σας στην εικόνα.
Ένα συνελικτικό νευρωνικό δίκτυο για ταξινόμηση εικόνων δεν είναι πολύ δύσκολο να κατανοηθεί. Μια εικόνα εισόδου υποβάλλεται σε επεξεργασία κατά τη φάση της συνέλιξης και αργότερα αποδίδεται μια ετικέτα.
Μια τυπική αρχιτεκτονική convnet μπορεί να συνοψιστεί στην παρακάτω εικόνα. Πρώτα απ 'όλα, μια εικόνα προωθείται στο δίκτυο. αυτό ονομάζεται εικόνα εισόδου. Στη συνέχεια, η εικόνα εισόδου περνά από έναν άπειρο αριθμό βημάτων. αυτό είναι το συνελικτικό μέρος του δικτύου. Τέλος, το νευρωνικό δίκτυο μπορεί να προβλέψει το ψηφίο στην εικόνα.

Μια εικόνα αποτελείται από μια σειρά pixel με ύψος και πλάτος. Μια εικόνα σε κλίμακα του γκρι έχει μόνο ένα κανάλι, ενώ η έγχρωμη εικόνα έχει τρία κανάλια (το καθένα για το κόκκινο, το πράσινο και το μπλε). Ένα κανάλι στοιβάζεται το ένα πάνω στο άλλο. Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε μια εικόνα σε κλίμακα του γκρι με ένα μόνο κανάλι. Κάθε pixel έχει μια τιμή από 0 έως 255 για να αντικατοπτρίζει την ένταση του χρώματος. Για παράδειγμα, ένα εικονοστοιχείο ίσο με 0 θα δείχνει λευκό χρώμα ενώ το εικονοστοιχείο με τιμή κοντά στο 255 θα είναι πιο σκούρο.
Ας ρίξουμε μια ματιά σε μια εικόνα που είναι αποθηκευμένη στο Δεδομένα MNIST. Η παρακάτω εικόνα δείχνει πώς να αναπαραστήσετε την εικόνα της αριστεράς σε μορφή matrix. Σημειώστε ότι, η αρχική μήτρα έχει τυποποιηθεί ώστε να είναι μεταξύ 0 και 1. Για πιο σκούρα χρώματα, η τιμή στη μήτρα είναι περίπου 0.9 ενώ τα λευκά εικονοστοιχεία έχουν τιμή 0.
Συνελικτική λειτουργία
Το πιο κρίσιμο στοιχείο στο μοντέλο είναι το συνελικτικό στρώμα. Αυτό το μέρος στοχεύει στη μείωση του μεγέθους της εικόνας για ταχύτερους υπολογισμούς των βαρών και στη βελτίωση της γενίκευσής της.
Κατά τη διάρκεια του συνελικτικού μέρους, το δίκτυο διατηρεί τα βασικά χαρακτηριστικά της εικόνας και αποκλείει άσχετους θορύβους. Για παράδειγμα, το μοντέλο μαθαίνει πώς να αναγνωρίζει έναν ελέφαντα από μια εικόνα με ένα βουνό στο φόντο. Εάν χρησιμοποιείτε ένα παραδοσιακό νευρωνικό δίκτυο, το μοντέλο θα εκχωρήσει ένα βάρος σε όλα τα εικονοστοιχεία, συμπεριλαμβανομένων αυτών από το βουνό, το οποίο δεν είναι απαραίτητο και μπορεί να παραπλανήσει το δίκτυο.
Αντίθετα, α Keras Το συνελικτικό νευρωνικό δίκτυο θα χρησιμοποιήσει μια μαθηματική τεχνική για να εξάγει μόνο τα πιο σχετικά pixel. Αυτή η μαθηματική πράξη ονομάζεται συνέλιξη. Αυτή η τεχνική επιτρέπει στο δίκτυο να μάθει όλο και πιο πολύπλοκα χαρακτηριστικά σε κάθε επίπεδο. Η συνέλιξη χωρίζει τη μήτρα σε μικρά κομμάτια για να μάθει τα περισσότερα βασικά στοιχεία σε κάθε κομμάτι.
Στοιχεία συνελικτικού νευρωνικού δικτύου (ConvNet ή CNN)
Υπάρχουν τέσσερα στοιχεία ενός Convnet
- Συνέλιξη
- Μη γραμμικότητα (ReLU)
- Poolinζ ή Υποδειγματοληψία
- Ταξινόμηση (Πλήρως συνδεδεμένο στρώμα)
Συνέλιξη
Ο σκοπός της συνέλιξης είναι να εξαγάγει τοπικά τα χαρακτηριστικά του αντικειμένου στην εικόνα. Σημαίνει ότι το δίκτυο θα μάθει συγκεκριμένα μοτίβα μέσα στην εικόνα και θα μπορεί να τα αναγνωρίζει παντού στην εικόνα.
Η συνέλιξη είναι ένας πολλαπλασιασμός βάσει στοιχείων. Η έννοια είναι εύκολα κατανοητή. Ο υπολογιστής θα σαρώσει ένα μέρος της εικόνας, συνήθως με διάσταση 3×3 και θα το πολλαπλασιάζει σε ένα φίλτρο. Η έξοδος του πολλαπλασιασμού βάσει στοιχείων ονομάζεται χάρτης χαρακτηριστικών. Αυτό το βήμα επαναλαμβάνεται μέχρι να σαρωθεί όλη η εικόνα. Σημειώστε ότι, μετά τη συνέλιξη, το μέγεθος της εικόνας μειώνεται.
Παρακάτω, υπάρχει μια διεύθυνση URL για να δείτε στην πράξη πώς λειτουργεί η συνέλιξη.
Υπάρχουν πολλά διαθέσιμα κανάλια. Παρακάτω, παραθέτουμε μερικά από τα κανάλια. Μπορείτε να δείτε ότι κάθε φίλτρο έχει έναν συγκεκριμένο σκοπό. Σημείωση, στην παρακάτω εικόνα. ο πυρήνας είναι συνώνυμο του φίλτρου.
Αριθμητική πίσω από τη συνέλιξη
Η συνελικτική φάση θα εφαρμόσει το φίλτρο σε μια μικρή σειρά pixel μέσα στην εικόνα. Το φίλτρο θα κινείται κατά μήκος της εικόνας εισόδου με γενικό σχήμα 3×3 ή 5×5. Σημαίνει ότι το δίκτυο θα σύρει αυτά τα παράθυρα σε όλη την εικόνα εισόδου και θα υπολογίσει τη συνέλιξη. Η παρακάτω εικόνα δείχνει πώς λειτουργεί η συνέλιξη. Το μέγεθος της ενημέρωσης κώδικα είναι 3×3 και η μήτρα εξόδου είναι το αποτέλεσμα της λειτουργίας βάσει στοιχείων μεταξύ της μήτρας εικόνας και του φίλτρου.
Παρατηρείτε ότι το πλάτος και το ύψος της εξόδου μπορεί να διαφέρουν από το πλάτος και το ύψος της εισόδου. Συμβαίνει λόγω του φαινομένου των συνόρων.
Εφέ συνόρων
Η εικόνα έχει χάρτη χαρακτηριστικών 5×5 και φίλτρο 3×3. Υπάρχει μόνο ένα παράθυρο στο κέντρο όπου το φίλτρο μπορεί να προβάλει ένα πλέγμα 3×3. Ο χάρτης χαρακτηριστικών εξόδου θα συρρικνωθεί κατά δύο πλακίδια μαζί με μια διάσταση 3×3.
Για να έχετε την ίδια διάσταση εξόδου με τη διάσταση εισόδου, πρέπει να προσθέσετε γέμιση. Η συμπλήρωση αποτελείται από την προσθήκη του σωστού αριθμού γραμμών και στηλών σε κάθε πλευρά του πίνακα. Θα επιτρέψει στην περιέλιξη να τοποθετήσει στο κέντρο κάθε πλακίδιο εισόδου. Στην παρακάτω εικόνα, ο πίνακας εισόδου/εξόδου έχει την ίδια διάσταση 5×5
Όταν ορίζετε το δίκτυο, τα συνελεγμένα χαρακτηριστικά ελέγχονται από τρεις παραμέτρους:
- Βάθος: Καθορίζει τον αριθμό των φίλτρων που θα εφαρμοστούν κατά τη συνέλιξη. Στο προηγούμενο παράδειγμα, είδατε ένα βάθος 1, που σημαίνει ότι χρησιμοποιείται μόνο ένα φίλτρο. Στις περισσότερες περιπτώσεις, υπάρχουν περισσότερα από ένα φίλτρα. Η παρακάτω εικόνα δείχνει τις λειτουργίες που έγιναν σε μια κατάσταση με τρία φίλτρα
- Δρασκελιά: Καθορίζει τον αριθμό του «άλματος εικονοστοιχείων» μεταξύ δύο τμημάτων. Εάν ο διασκελισμός είναι ίσος με 1, τα παράθυρα θα κινούνται με διάσταση pixel ίσο με ένα. Εάν ο διασκελισμός είναι ίσος με δύο, τα παράθυρα θα πηδούν κατά 2 pixel. Εάν αυξήσετε το βήμα, θα έχετε μικρότερους χάρτες χαρακτηριστικών.
Παράδειγμα βήματος 1
άλμα 2
- Μηδενική επένδυση: Το padding είναι μια ενέργεια προσθήκης αντίστοιχου αριθμού γραμμών και στηλών σε κάθε πλευρά των χαρτών των χαρακτηριστικών εισόδου. Σε αυτή την περίπτωση, η έξοδος έχει την ίδια διάσταση με την είσοδο.
Μη γραμμικότητα (ReLU)
Στο τέλος της λειτουργίας συνέλιξης, η έξοδος υπόκειται σε μια συνάρτηση ενεργοποίησης που επιτρέπει τη μη γραμμικότητα. Η συνήθης λειτουργία ενεργοποίησης για το convnet είναι το Relu. Όλα τα εικονοστοιχεία με αρνητική τιμή θα αντικατασταθούν από μηδέν.
Pooling Operaσμού
Αυτό το βήμα είναι εύκολο να γίνει κατανοητό. Ο σκοπός της συγκέντρωσης είναι να μειώσει τη διάσταση της εικόνας εισόδου. Τα βήματα γίνονται για να μειωθεί η υπολογιστική πολυπλοκότητα της λειτουργίας. Μειώνοντας τη διάσταση, το δίκτυο έχει μικρότερα βάρη για υπολογισμό, επομένως αποτρέπει την υπερπροσαρμογή.
Σε αυτό το στάδιο, πρέπει να ορίσετε το μέγεθος και τον διασκελισμό. Ένας τυπικός τρόπος για τη συγκέντρωση της εικόνας εισόδου είναι η χρήση της μέγιστης τιμής του χάρτη χαρακτηριστικών. Κοιτάξτε την παρακάτω εικόνα. Η "ομαδοποίηση" θα εμφανίσει έναν υπομήτρα τεσσάρων του χάρτη χαρακτηριστικών 4×4 και θα επιστρέψει τη μέγιστη τιμή. Η συγκέντρωση παίρνει τη μέγιστη τιμή ενός πίνακα 2×2 και στη συνέχεια μετακινεί αυτά τα παράθυρα κατά δύο pixel. Για παράδειγμα, ο πρώτος υπομήτρας είναι [3,1,3,2], η συγκέντρωση θα επιστρέψει το μέγιστο, το οποίο είναι 3.
Υπάρχει μια άλλη λειτουργία συγκέντρωσης όπως η μέση τιμή.
Αυτή η λειτουργία μειώνει επιθετικά το μέγεθος του χάρτη χαρακτηριστικών
Πλήρως συνδεδεμένα στρώματα
Το τελευταίο βήμα συνίσταται στην οικοδόμηση ενός παραδοσιακού τεχνητό νευρικό δίκτυο όπως κάνατε στο προηγούμενο σεμινάριο. Συνδέετε όλους τους νευρώνες από το προηγούμενο στρώμα στο επόμενο στρώμα. Χρησιμοποιείτε μια λειτουργία ενεργοποίησης softmax για να ταξινομήσετε τον αριθμό στην εικόνα εισόδου.
Ανακεφαλαιώσουμε:
Το συνελικτικό νευρωνικό δίκτυο TensorFlow συγκεντρώνει διαφορετικά επίπεδα πριν κάνει μια πρόβλεψη. Ένα νευρωνικό δίκτυο έχει:
- Ένα συνελικτικό στρώμα
- Λειτουργία ενεργοποίησης Relu
- Poolinστρώση g
- Πυκνά συνδεδεμένο στρώμα
Τα συνελικτικά στρώματα εφαρμόζουν διαφορετικά φίλτρα σε μια υποπεριοχή της εικόνας. Η λειτουργία ενεργοποίησης Relu προσθέτει μη γραμμικότητα και τα επίπεδα συγκέντρωσης μειώνουν τη διάσταση των χαρτών χαρακτηριστικών.
Όλα αυτά τα επίπεδα εξάγουν βασικές πληροφορίες από τις εικόνες. Επιτέλους, ο χάρτης χαρακτηριστικών τροφοδοτείται σε ένα πρωτεύον πλήρως συνδεδεμένο επίπεδο με μια συνάρτηση softmax για να κάνει μια πρόβλεψη.
Εκπαιδεύστε το CNN με το TensorFlow
Τώρα που είστε εξοικειωμένοι με το δομικό στοιχείο ενός convnets, είστε έτοιμοι να δημιουργήσετε ένα με TensorFlow. Θα χρησιμοποιήσουμε το σύνολο δεδομένων MNIST για ταξινόμηση εικόνων CNN.
Η προετοιμασία των δεδομένων είναι η ίδια με το προηγούμενο σεμινάριο. Μπορείτε να εκτελέσετε τους κωδικούς και να μεταβείτε απευθείας στην αρχιτεκτονική του CNN.
Θα ακολουθήσετε τα παρακάτω βήματα για την ταξινόμηση εικόνων χρησιμοποιώντας το CNN:
Βήμα 1: Μεταφόρτωση συνόλου δεδομένων
Βήμα 2: Επίπεδο εισόδου
Βήμα 3: Συνελικτικό στρώμα
Βήμα 4: Poolinστρώση g
Βήμα 5: Δεύτερο συνελικτικό στρώμα και Pooling Στρώμα
Βήμα 6: Πυκνό στρώμα
Βήμα 7: Logit Layer
Βήμα 1: Μεταφόρτωση συνόλου δεδομένων
Το σύνολο δεδομένων MNIST είναι διαθέσιμο με το scikit για να μάθετε σε αυτό URL. Κατεβάστε το και αποθηκεύστε το στις Λήψεις. Μπορείτε να το ανεβάσετε με το fetch_mldata('MNIST original').
Δημιουργήστε ένα σετ τρένου/δοκιμών
Πρέπει να διαιρέσετε το σύνολο δεδομένων με train_test_split
Κλιμακώστε τα χαρακτηριστικά
Τέλος, μπορείτε να κλιμακώσετε τη δυνατότητα με το MinMaxScaler όπως φαίνεται στην παρακάτω ταξινόμηση εικόνας χρησιμοποιώντας το παράδειγμα TensorFlow CNN.
import numpy as np import tensorflow as tf from sklearn.datasets import fetch_mldata #Change USERNAME by the username of your machine ## Windows USER mnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original') ## Mac User mnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original') print(mnist.data.shape) print(mnist.target.shape) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape ) ## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64)) feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])] X_train_scaled.shape[1:]
Ορίστε το CNN
Ένα CNN χρησιμοποιεί φίλτρα στο ακατέργαστο pixel μιας εικόνας για να μάθει το μοτίβο λεπτομερειών σε σύγκριση με το παγκόσμιο μοτίβο με ένα παραδοσιακό νευρωνικό δίκτυο. Για να δημιουργήσετε ένα CNN, πρέπει να ορίσετε:
- Συνελικτικό επίπεδο: Εφαρμόστε n αριθμό φίλτρων στον χάρτη χαρακτηριστικών. Μετά τη συνέλιξη, πρέπει να χρησιμοποιήσετε μια λειτουργία ενεργοποίησης Relu για να προσθέσετε μη γραμμικότητα στο δίκτυο.
- PoolinΕπίπεδο g: Το επόμενο βήμα μετά τη συνέλιξη είναι η μείωση του δείγματος του μέγ. Ο σκοπός είναι να μειωθεί η διάσταση του χάρτη χαρακτηριστικών για να αποφευχθεί η υπερβολική προσαρμογή και να βελτιωθεί η ταχύτητα υπολογισμού. Το Max pooling είναι η συμβατική τεχνική, η οποία χωρίζει τους χάρτες χαρακτηριστικών σε υποπεριοχές (συνήθως με μέγεθος 2×2) και διατηρεί μόνο τις μέγιστες τιμές.
- Πλήρως συνδεδεμένα στρώματα: Όλοι οι νευρώνες από τα προηγούμενα στρώματα συνδέονται με τα επόμενα στρώματα. Το CNN θα ταξινομήσει την ετικέτα σύμφωνα με τα χαρακτηριστικά από τα συνελικτικά στρώματα και θα μειωθεί με το στρώμα συγκέντρωσης.
Αρχιτεκτονική του CNN
- Convolutional Layer: Εφαρμόζει 14 φίλτρα 5×5 (εξαγωγή υποπεριοχών 5×5 pixel), με λειτουργία ενεργοποίησης ReLU
- Pooling Layer: Πραγματοποιεί μέγιστη συγκέντρωση με φίλτρο 2×2 και διασκελισμό 2 (που καθορίζει ότι οι ομαδοποιημένες περιοχές δεν επικαλύπτονται)
- Convolutional Layer: Εφαρμόζει 36 φίλτρα 5×5, με λειτουργία ενεργοποίησης ReLU
- Pooling Επίπεδο #2: Και πάλι, εκτελεί μέγιστη συγκέντρωση με ένα φίλτρο 2×2 και διασκελισμό 2
- 1,764 νευρώνες, με ποσοστό τακτοποίησης εγκατάλειψης 0.4 (πιθανότητα 0.4 ότι οποιοδήποτε δεδομένο στοιχείο θα απορριφθεί κατά τη διάρκεια της προπόνησης)
- Πυκνό Επίπεδο (Επίπεδο Logits): 10 νευρώνες, ένας για κάθε κλάση στόχου ψηφίου (0–9).
Υπάρχουν τρεις σημαντικές ενότητες που πρέπει να χρησιμοποιηθούν για τη δημιουργία ενός CNN:
- conv2d(). Κατασκευάζει ένα δισδιάστατο συνελικτικό επίπεδο με τον αριθμό των φίλτρων, το μέγεθος του πυρήνα του φίλτρου, το padding και τη συνάρτηση ενεργοποίησης ως ορίσματα.
- max_pooling2d(). Κατασκευάζει ένα δισδιάστατο στρώμα συγκέντρωσης χρησιμοποιώντας τον αλγόριθμο max-pooling.
- πυκνός(). Κατασκευάζει ένα πυκνό στρώμα με τα κρυφά στρώματα και τις μονάδες
Θα ορίσετε μια συνάρτηση για τη δημιουργία του CNN. Ας δούμε λεπτομερώς πώς να κατασκευάσουμε κάθε δομικό στοιχείο πριν να τυλίξουμε τα πάντα μαζί στη συνάρτηση.
Βήμα 2: Επίπεδο εισόδου
def cnn_model_fn(features, labels, mode): input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
Πρέπει να ορίσετε έναν τανυστή με το σχήμα των δεδομένων. Για αυτό, μπορείτε να χρησιμοποιήσετε τη μονάδα tf.reshape. Σε αυτήν την ενότητα, πρέπει να δηλώσετε τον τανυστή να αναδιαμορφωθεί και το σχήμα του τανυστή. Το πρώτο όρισμα είναι τα χαρακτηριστικά των δεδομένων, τα οποία ορίζονται στο όρισμα της συνάρτησης.
Μια εικόνα έχει ύψος, πλάτος και κανάλι. Το σύνολο δεδομένων MNIST είναι μια μονόχρονη εικόνα με μέγεθος 28×28. Ορίσαμε το μέγεθος παρτίδας σε -1 στο όρισμα σχήματος έτσι ώστε να πάρει το σχήμα των χαρακτηριστικών [“x”]. Το πλεονέκτημα είναι να συντονίζονται οι υπερπαράμετροι μεγέθους παρτίδας. Εάν το μέγεθος παρτίδας οριστεί στο 7, τότε ο τανυστής θα τροφοδοτήσει 5,488 τιμές (28*28*7).
Βήμα 3: Συνελικτικό στρώμα
# first Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=14, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
Το πρώτο συνελικτικό στρώμα έχει 14 φίλτρα με μέγεθος πυρήνα 5×5 με την ίδια επένδυση. Η ίδια επένδυση σημαίνει ότι τόσο ο τανυστής εξόδου όσο και ο τανυστήρας εισόδου πρέπει να έχουν το ίδιο ύψος και πλάτος. Το Tensorflow θα προσθέσει μηδενικά στις σειρές και τις στήλες για να εξασφαλίσει το ίδιο μέγεθος.
Χρησιμοποιείτε τη λειτουργία ενεργοποίησης Relu. Το μέγεθος εξόδου θα είναι [28, 28, 14].
Βήμα 4: Poolinστρώση g
Το επόμενο βήμα μετά τη συνέλιξη είναι ο υπολογισμός συγκέντρωσης. Ο υπολογισμός συγκέντρωσης θα μειώσει τη διάσταση των δεδομένων. Μπορείτε να χρησιμοποιήσετε τη μονάδα max_pooling2d με μέγεθος 2×2 και διασκελισμό 2. Χρησιμοποιείτε το προηγούμενο επίπεδο ως είσοδο. Το μέγεθος εξόδου θα είναι [batch_size, 14, 14, 14]
# first Pooling Layer pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
Βήμα 5: Δεύτερο συνελικτικό στρώμα και Pooling Στρώμα
Το δεύτερο συνελικτικό στρώμα έχει 32 φίλτρα, με μέγεθος εξόδου [batch_size, 14, 14, 32]. Το στρώμα συγκέντρωσης έχει το ίδιο μέγεθος με πριν και το σχήμα εξόδου είναι [batch_size, 14, 14, 18].
conv2 = tf.layers.conv2d( inputs=pool1, filters=36, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
Βήμα 6: Πυκνό στρώμα
Στη συνέχεια, πρέπει να ορίσετε το πλήρως συνδεδεμένο επίπεδο. Ο χάρτης χαρακτηριστικών πρέπει να ισοπεδωθεί πριν συνδεθεί με το πυκνό στρώμα. Μπορείτε να χρησιμοποιήσετε το reshape module με μέγεθος 7*7*36.
Το πυκνό στρώμα θα συνδέσει 1764 νευρώνες. Προσθέτετε μια λειτουργία ενεργοποίησης Relu. Επιπλέον, προσθέτετε έναν όρο τακτοποίησης εγκατάλειψης με ποσοστό 0.3, που σημαίνει ότι το 30 τοις εκατό των βαρών θα οριστεί σε 0. Σημειώστε ότι, η εγκατάλειψη πραγματοποιείται μόνο κατά τη φάση της προπόνησης. Η συνάρτηση cnn_model_fn έχει μια λειτουργία ορίσματος για να δηλώσει εάν το μοντέλο πρέπει να εκπαιδευτεί ή να αξιολογηθεί όπως φαίνεται στο παρακάτω παράδειγμα ταξινόμησης εικόνας CNN TensorFlow.
pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36]) dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu) dropout = tf.layers.dropout( inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)
Βήμα 7: Logit Layer
Τέλος, στο παράδειγμα ταξινόμησης εικόνας TensorFlow, μπορείτε να ορίσετε το τελευταίο επίπεδο με την πρόβλεψη του μοντέλου. Το σχήμα εξόδου είναι ίσο με το μέγεθος παρτίδας και 10, τον συνολικό αριθμό εικόνων.
# Logits Layer logits = tf.layers.dense(inputs=dropout, units=10)
Μπορείτε να δημιουργήσετε ένα λεξικό που να περιέχει τις κλάσεις και την πιθανότητα κάθε τάξης. Η λειτουργική μονάδα tf.argmax() με επιστρέφει την υψηλότερη τιμή εάν τα επίπεδα logit. Η συνάρτηση softmax επιστρέφει την πιθανότητα κάθε κλάσης.
predictions = { # Generate predictions "classes": tf.argmax(input=logits, axis=1), "probabilities": tf.nn.softmax(logits, name="softmax_tensor") }
Θέλετε να επιστρέψετε την πρόβλεψη λεξικού μόνο όταν η λειτουργία έχει ρυθμιστεί σε πρόβλεψη. Προσθέτετε αυτούς τους κωδικούς για να απορρίψετε τις προβλέψεις
if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
Το επόμενο βήμα συνίσταται στον υπολογισμό της απώλειας του μοντέλου. Στο τελευταίο σεμινάριο, μάθατε ότι η συνάρτηση απώλειας για ένα μοντέλο πολλαπλών κλάσεων είναι η διασταυρούμενη εντροπία. Η απώλεια υπολογίζεται εύκολα με τον ακόλουθο κώδικα:
# Calculate Loss (for both TRAIN and EVAL modes) loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
Το τελευταίο βήμα του παραδείγματος του TensorFlow CNN είναι η βελτιστοποίηση του μοντέλου, δηλαδή η εύρεση των καλύτερων τιμών των βαρών. Για αυτό, χρησιμοποιείτε ένα Gradient descent optimizer με ρυθμό εκμάθησης 0.001. Ο στόχος είναι να ελαχιστοποιηθεί η απώλεια
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) train_op = optimizer.minimize( loss=loss, global_step=tf.train.get_global_step())
Τελειώσατε με το CNN. Ωστόσο, θέλετε να εμφανίσετε τις μετρήσεις απόδοσης κατά τη λειτουργία αξιολόγησης. Οι μετρήσεις απόδοσης για ένα μοντέλο πολλαπλών κλάσεων είναι οι μετρήσεις ακρίβειας. Το Tensorflow είναι εξοπλισμένο με μια μονάδα ακρίβειας με δύο ορίσματα, τις ετικέτες και τις προβλεπόμενες τιμές.
eval_metric_ops = { "accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])} return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
Αυτό είναι. Δημιουργήσατε το πρώτο σας CNN και είστε έτοιμοι να τυλίξετε τα πάντα σε μια συνάρτηση για να το χρησιμοποιήσετε για να εκπαιδεύσετε και να αξιολογήσετε το μοντέλο.
def cnn_model_fn(features, labels, mode): """Model function for CNN.""" # Input Layer input_layer = tf.reshape(features["x"], [-1, 28, 28, 1]) # Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) # Pooling Layer pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) # Convolutional Layer #2 and Pooling Layer conv2 = tf.layers.conv2d( inputs=pool1, filters=36, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) # Dense Layer pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36]) dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu) dropout = tf.layers.dropout( inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN) # Logits Layer logits = tf.layers.dense(inputs=dropout, units=10) predictions = { # Generate predictions (for PREDICT and EVAL mode) "classes": tf.argmax(input=logits, axis=1), "probabilities": tf.nn.softmax(logits, name="softmax_tensor") } if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) # Calculate Loss loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) # Configure the Training Op (for TRAIN mode) if mode == tf.estimator.ModeKeys.TRAIN: optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) train_op = optimizer.minimize( loss=loss, global_step=tf.train.get_global_step()) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) # Add evaluation metrics Evaluation mode eval_metric_ops = { "accuracy": tf.metrics.accuracy( labels=labels, predictions=predictions["classes"])} return tf.estimator.EstimatorSpec( mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
Τα παρακάτω βήματα είναι τα ίδια με τα προηγούμενα σεμινάρια.
Πρώτα από όλα, ορίζετε έναν εκτιμητή με το μοντέλο CNN για ταξινόμηση εικόνων.
# Create the Estimator mnist_classifier = tf.estimator.Estimator( model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")
Ένα CNN χρειάζεται πολλές φορές για να εκπαιδευτεί, επομένως, δημιουργείτε ένα άγκιστρο καταγραφής για να αποθηκεύετε τις τιμές των επιπέδων softmax κάθε 50 επαναλήψεις.
# Set up logging for predictions tensors_to_log = {"probabilities": "softmax_tensor"} logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)
Είστε έτοιμοι να εκτιμήσετε το μοντέλο. Ορίζετε ένα μέγεθος παρτίδας 100 και ανακατεύετε τα δεδομένα. Σημειώστε ότι ορίσαμε προπονητικά βήματα 16.000, μπορεί να χρειαστεί πολύς χρόνος για να προπονηθείτε. Κάνε υπομονή.
# Train the model train_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=100, num_epochs=None, shuffle=True) mnist_classifier.train( input_fn=train_input_fn, steps=16000, hooks=[logging_hook])
Τώρα που το μοντέλο είναι τρένο, μπορείτε να το αξιολογήσετε και να εκτυπώσετε τα αποτελέσματα
# Evaluate the model and print results eval_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, num_epochs=1, shuffle=False) eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn) print(eval_results)
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-08-05-12:52:41 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56 INFO:tensorflow:Saving dict for global step 15652: accuracy = 0.9589286, global_step = 15652, loss = 0.13894269 {'accuracy': 0.9689286, 'loss': 0.13894269, 'global_step': 15652}
Με την τρέχουσα αρχιτεκτονική, έχετε ακρίβεια 97%. Μπορείτε να αλλάξετε την αρχιτεκτονική, το μέγεθος παρτίδας και τον αριθμό των επαναλήψεων για να βελτιώσετε την ακρίβεια. Το νευρωνικό δίκτυο του CNN έχει αποδώσει πολύ καλύτερα από το ANN ή την λογιστική παλινδρόμηση. Στο σεμινάριο για το τεχνητό νευρωνικό δίκτυο, είχατε ακρίβεια 96%, που είναι χαμηλότερη από το CNN. Οι παραστάσεις του CNN είναι εντυπωσιακές με μεγαλύτερη εικόνα σειρά, τόσο ως προς τον υπολογισμό της ταχύτητας όσο και ως προς την ακρίβεια.
Σύνοψη
Ένα συνελικτικό νευρωνικό δίκτυο λειτουργεί πολύ καλά για την αξιολόγηση της εικόνας. Αυτός ο τύπος αρχιτεκτονικής είναι κυρίαρχος για την αναγνώριση αντικειμένων από μια εικόνα ή ένα βίντεο.
Για να δημιουργήσετε ένα TensorFlow CNN, πρέπει να ακολουθήσετε Επτά βήματα:
Βήμα 1: Μεταφόρτωση συνόλου δεδομένων:
Το σύνολο δεδομένων MNIST είναι διαθέσιμο με το scikit για εκμάθηση. Κατεβάστε το και αποθηκεύστε το στις Λήψεις. Μπορείτε να το ανεβάσετε με το fetch_mldata('MNIST original').
Βήμα 2: Επίπεδο εισόδου:
Αυτό το βήμα αναδιαμορφώνει τα δεδομένα. Το σχήμα είναι ίσο με την τετραγωνική ρίζα του αριθμού των pixel. Για παράδειγμα, εάν μια εικόνα έχει 156 pixel, τότε το σχήμα είναι 26×26. Πρέπει να καθορίσετε εάν η εικόνα έχει χρώμα ή όχι. Εάν ναι, τότε είχατε 3 στο σχήμα- 3 για RGB-, διαφορετικά 1.
input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
Βήμα 3: Συνελικτικό στρώμα
Στη συνέχεια, πρέπει να δημιουργήσετε τα συνελικτικά επίπεδα. Εφαρμόζετε διαφορετικά φίλτρα για να επιτρέψετε στο δίκτυο να μάθει σημαντικά χαρακτηριστικά. Καθορίζετε το μέγεθος του πυρήνα και την ποσότητα των φίλτρων.
conv1 = tf.layers.conv2d( inputs=input_layer, filters=14, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
Βήμα 4: Poolinστρώση g
Στο τρίτο βήμα, προσθέτετε ένα στρώμα συγκέντρωσης. Αυτό το επίπεδο μειώνει το μέγεθος της εισόδου. Το κάνει παίρνοντας τη μέγιστη τιμή του υπο-μήτρας. Για παράδειγμα, εάν ο υπομήτρας είναι [3,1,3,2], η συγκέντρωση θα επιστρέψει το μέγιστο, το οποίο είναι 3.
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
Βήμα 5: Προσθήκη συνελικτικού επιπέδου και Pooling Στρώμα
Σε αυτό το βήμα, μπορείτε να προσθέσετε όσα επίπεδα μετατροπής θέλετε και επίπεδα συγκέντρωσης. Η Google χρησιμοποιεί αρχιτεκτονική με περισσότερα από 20 επίπεδα μετατροπής.
Βήμα 6: Πυκνό στρώμα
Το βήμα 6 ισοπεδώστε το προηγούμενο για να δημιουργήσετε ένα πλήρως συνδεδεμένο στρώμα. Σε αυτό το βήμα, μπορείτε να χρησιμοποιήσετε διαφορετική λειτουργία ενεργοποίησης και να προσθέσετε ένα εφέ εγκατάλειψης.
pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36]) dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu) dropout = tf.layers.dropout( inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)
Βήμα 7: Επίπεδο Logit
Το τελευταίο βήμα είναι η πρόβλεψη.
logits = tf.layers.dense(inputs=dropout, units=10)