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

Μια εικόνα αποτελείται από μια σειρά από pixel με ύψος και πλάτος. Μια εικόνα σε κλίμακα του γκρι έχει μόνο ένα κανάλι, ενώ η έγχρωμη εικόνα έχει τρία κανάλια (κάθε ένα για κόκκινο, πράσινο και μπλε). Τα κανάλια στοιβάζονται το ένα πάνω στο άλλο. Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε μια εικόνα σε κλίμακα του γκρι με μόνο ένα κανάλι. Κάθε pixel έχει τιμή από 0 έως 255 για να αντικατοπτρίζει την ένταση του χρώματος. Για παράδειγμα, ένα pixel ίσο με 0 θα εμφανίζει λευκό χρώμα, ενώ ένα pixel με τιμή κοντά στο 255 θα είναι πιο σκούρο.
Ας ρίξουμε μια ματιά σε μια εικόνα που είναι αποθηκευμένη στο Δεδομένα MNISTΗ παρακάτω εικόνα δείχνει πώς να αναπαραστήσετε την εικόνα στα αριστερά σε μορφή πίνακα. Σημειώστε ότι ο αρχικός πίνακας έχει τυποποιηθεί ώστε να είναι μεταξύ 0 και 1. Για πιο σκούρα χρώματα, η τιμή στον πίνακα είναι περίπου 0.9, ενώ τα λευκά pixel έχουν τιμή 0.
Συνελικτική λειτουργία
Το πιο κρίσιμο στοιχείο του μοντέλου είναι το συνελικτικό επίπεδο. Αυτό το μέρος στοχεύει στη μείωση του μεγέθους της εικόνας για ταχύτερους υπολογισμούς των βαρών και βελτίωση της γενίκευσης.
Κατά τη διάρκεια του συνελικτικού μέρους, το δίκτυο διατηρεί τα βασικά χαρακτηριστικά της εικόνας και αποκλείει άσχετους θορύβους. Για παράδειγμα, το μοντέλο μαθαίνει πώς να αναγνωρίζει έναν ελέφαντα από μια εικόνα με ένα βουνό στο φόντο. Εάν χρησιμοποιείτε ένα παραδοσιακό νευρωνικό δίκτυο, το μοντέλο θα εκχωρήσει ένα βάρος σε όλα τα εικονοστοιχεία, συμπεριλαμβανομένων αυτών από το βουνό, το οποίο δεν είναι απαραίτητο και μπορεί να παραπλανήσει το δίκτυο.
Αντίθετα, α Keras Το συνελικτικό νευρωνικό δίκτυο θα χρησιμοποιήσει μια μαθηματική τεχνική για να εξηγήσειtracμόνο τα πιο σχετικά pixel. Αυτή η μαθηματική πράξη ονομάζεται συνέλιξη. Αυτή η τεχνική επιτρέπει στο δίκτυο να μαθαίνει ολοένα και πιο πολύπλοκα χαρακτηριστικά σε κάθε επίπεδο. Η συνέλιξη διαιρεί τον πίνακα σε μικρά κομμάτια για να μάθει τα πιο σημαντικά στοιχεία μέσα σε κάθε κομμάτι.
Στοιχεία συνελικτικού νευρωνικού δικτύου (ConvNet ή CNN)
Υπάρχουν τέσσερα στοιχεία ενός convnet:
- Συνέλιξη
- Μη γραμμικότητα (ReLU)
- Poolinζ ή Υποδειγματοληψία
- Ταξινόμηση (Πλήρως συνδεδεμένο στρώμα)
Συνέλιξη
Ο σκοπός της συνέλιξης είναι να εξηγηθείtracτα χαρακτηριστικά του αντικειμένου στην εικόνα τοπικά. Αυτό σημαίνει ότι το δίκτυο θα μάθει συγκεκριμένα μοτίβα μέσα στην εικόνα και θα είναι σε θέση να τα αναγνωρίσει παντού στην εικόνα.
Η συνέλιξη είναι ένας πολλαπλασιασμός ανά στοιχεία. Η έννοια είναι εύκολο να κατανοηθεί. Ο υπολογιστής θα σαρώσει ένα μέρος της εικόνας, συνήθως με διάσταση 3×3, και θα το πολλαπλασιάσει με ένα φίλτρο. Το αποτέλεσμα του πολλαπλασιασμού ανά στοιχεία ονομάζεται χάρτης χαρακτηριστικών. Αυτό το βήμα επαναλαμβάνεται μέχρι να σαρωθεί ολόκληρη η εικόνα. Σημειώστε ότι, μετά τη συνέλιξη, το μέγεθος της εικόνας μειώνεται.
Το παρακάτω διάγραμμα δείχνει ένα τμήμα της εικόνας που πολλαπλασιάζεται με το φίλτρο για να παραχθεί ένα μόνο κελί του χάρτη χαρακτηριστικών.
Η παρακάτω κινούμενη εικόνα δείχνει την ίδια συνέλιξη που εκτείνεται σε ολόκληρη την εικόνα.
Υπάρχουν πολλά διαθέσιμα φίλτρα. Παρακάτω, παραθέτουμε μερικά από αυτά. Μπορείτε να δείτε ότι κάθε φίλτρο έχει έναν συγκεκριμένο σκοπό. Σημειώστε ότι στην παρακάτω εικόνα ο πυρήνας είναι συνώνυμος του φίλτρου.
Αριθμητική πίσω από τη συνέλιξη
Η φάση της συνέλιξης θα εφαρμόσει το φίλτρο σε μια μικρή συστοιχία pixel μέσα στην εικόνα. Το φίλτρο θα κινηθεί κατά μήκος της εικόνας εισόδου με γενικό σχήμα 3×3 ή 5×5. Αυτό σημαίνει ότι το δίκτυο θα σύρει αυτά τα παράθυρα σε όλη την εικόνα εισόδου και θα υπολογίσει τη συνέλιξη. Η παρακάτω κινούμενη εικόνα δείχνει πώς λειτουργεί η συνέλιξη. Το μέγεθος του patch είναι 3×3 και ο πίνακας εξόδου είναι το αποτέλεσμα της λειτουργίας ανά στοιχείο μεταξύ του πίνακα εικόνας και του φίλτρου.
Παρατηρείτε ότι το πλάτος και το ύψος της εξόδου μπορεί να διαφέρουν από το πλάτος και το ύψος της εισόδου. Συμβαίνει λόγω του φαινομένου των συνόρων.
Εφέ συνόρων
Η εικόνα έχει έναν χάρτη χαρακτηριστικών 5×5 και ένα φίλτρο 3×3. Υπάρχει μόνο ένα παράθυρο στο κέντρο όπου το φίλτρο μπορεί να προβάλει ένα πλέγμα 3×3. Ο χάρτης χαρακτηριστικών εξόδου συρρικνώνεται κατά δύο πλακίδια σε κάθε άξονα, αφήνοντας μια διάσταση 3×3.
Για να λάβετε την ίδια διάσταση εξόδου με τη διάσταση εισόδου, πρέπει να προσθέσετε συμπλήρωση. Η συμπλήρωση συνίσταται στην προσθήκη του σωστού αριθμού γραμμών και στηλών σε κάθε πλευρά του πίνακα. Αυτό θα επιτρέψει στη συνέλιξη να κεντράρει κάθε πλακίδιο εισόδου. Στην παρακάτω εικόνα, οι πίνακες εισόδου και εξόδου έχουν την ίδια διάσταση, 5×5.
Όταν ορίζετε το δίκτυο, τα συνελεγμένα χαρακτηριστικά ελέγχονται από τρεις παραμέτρους:
Βάθος: Ορίζει τον αριθμό των φίλτρων που θα εφαρμοστούν κατά τη διάρκεια της συνέλιξης. Στο προηγούμενο παράδειγμα, είδατε βάθος 1, που σημαίνει ότι χρησιμοποιείται μόνο ένα φίλτρο. Στις περισσότερες περιπτώσεις, υπάρχουν περισσότερα από ένα φίλτρα. Η παρακάτω κινούμενη εικόνα δείχνει τις λειτουργίες που εκτελούνται σε μια περίπτωση με τρία φίλτρα.
Δρασκελιά: Ορίζει τον αριθμό των «άλματος pixel» μεταξύ δύο τομών. Εάν το βήμα είναι ίσο με 1, το παράθυρο θα μετακινηθεί με άνοιγμα pixel ίσο με ένα. Εάν το βήμα είναι ίσο με δύο, το παράθυρο θα μετακινηθεί κατά 2 pixel. Εάν αυξήσετε το βήμα, θα έχετε μικρότερους χάρτες χαρακτηριστικών. Τα δύο παρακάτω διαγράμματα συγκρίνουν ένα βήμα 1 με ένα βήμα 2.
Παράδειγμα βήματος 1
άλμα 2
Μηδενική συμπλήρωση: Η συμπλήρωση είναι μια λειτουργία προσθήκης ενός αντίστοιχου αριθμού γραμμών και στηλών σε κάθε πλευρά των χαρτών χαρακτηριστικών εισόδου. Σε αυτήν την περίπτωση, η έξοδος έχει την ίδια διάσταση με την είσοδο.
Μη γραμμικότητα (ReLU)
Στο τέλος της λειτουργίας συνέλιξης, η έξοδος υπόκειται σε μια συνάρτηση ενεργοποίησης για να επιτρέψει τη μη γραμμικότητα. Η συνήθης συνάρτηση ενεργοποίησης για ένα δίκτυο convnet είναι η ReLU. Όλα τα pixel με αρνητική τιμή θα αντικατασταθούν από μηδέν.
Pooling Operaσμού
Αυτό το βήμα είναι εύκολο να κατανοηθεί. Ο σκοπός της ομαδοποίησης είναι η μείωση της διαστασιολόγησης της εικόνας εισόδου. Τα βήματα γίνονται για να μειωθεί η υπολογιστική πολυπλοκότητα της λειτουργίας. Μειώνοντας τη διαστασιολόγηση, το δίκτυο έχει λιγότερα βάρη προς υπολογισμό, επομένως αποτρέπεται η υπερπροσαρμογή.
Σε αυτό το στάδιο, πρέπει να ορίσετε το μέγεθος και το βήμα. Ένας τυπικός τρόπος για να ομαδοποιήσετε την εικόνα εισόδου είναι να χρησιμοποιήσετε τη μέγιστη τιμή του χάρτη χαρακτηριστικών. Κοιτάξτε την παρακάτω εικόνα. Η ομαδοποίηση θα εμφανίσει τέσσερις υποπίνακες του χάρτη χαρακτηριστικών 4×4 και θα επιστρέψει τη μέγιστη τιμή. Η ομαδοποίηση λαμβάνει τη μέγιστη τιμή ενός πίνακα 2×2 και στη συνέχεια μετακινεί αυτό το παράθυρο κατά δύο pixel. Για παράδειγμα, ο πρώτος υποπίνακας είναι [3,1,3,2], επομένως η ομαδοποίηση θα επιστρέψει τη μέγιστη τιμή, η οποία είναι 3.
Υπάρχει μια άλλη λειτουργία συγκέντρωσης όπως η μέση τιμή.
Αυτή η λειτουργία μειώνει δραστικά το μέγεθος του χάρτη χαρακτηριστικών.
Πλήρως συνδεδεμένα στρώματα
Το τελευταίο βήμα συνίσταται στην οικοδόμηση ενός παραδοσιακού τεχνητό νευρικό δίκτυο όπως κάνατε στο προηγούμενο σεμινάριο. Συνδέετε όλους τους νευρώνες από το προηγούμενο στρώμα στο επόμενο στρώμα. Χρησιμοποιείτε μια λειτουργία ενεργοποίησης softmax για να ταξινομήσετε τον αριθμό στην εικόνα εισόδου.
Ανακεφαλαιώσουμε:
Ένα συνελικτικό νευρωνικό δίκτυο TensorFlow μεταγλωττίζει διαφορετικά επίπεδα πριν κάνει μια πρόβλεψη. Ένα νευρωνικό δίκτυο έχει:
- Ένα συνελικτικό στρώμα
- Λειτουργία ενεργοποίησης ReLU
- Poolinστρώση g
- Πυκνά συνδεδεμένο στρώμα
Τα συνελικτικά επίπεδα εφαρμόζουν διαφορετικά φίλτρα σε μια υποπεριοχή της εικόνας. Η συνάρτηση ενεργοποίησης ReLU προσθέτει μη γραμμικότητα και τα επίπεδα ομαδοποίησης μειώνουν τη διαστασιμότητα των χαρτών χαρακτηριστικών.
Όλα αυτά τα στρώματα π.χ.tracβασικές πληροφορίες από τις εικόνες. Τέλος, οι χάρτες χαρακτηριστικών τροφοδοτούνται σε ένα πλήρως συνδεδεμένο επίπεδο με μια συνάρτηση softmax για να κάνουν μια πρόβλεψη.
Εκπαιδεύστε το CNN με το TensorFlow
Τώρα που είστε εξοικειωμένοι με τα δομικά στοιχεία ενός δικτύου, είστε έτοιμοι να δημιουργήσετε ένα με TensorFlow. Θα χρησιμοποιήσουμε το σύνολο δεδομένων MNIST για ταξινόμηση εικόνων CNN.
Η προετοιμασία των δεδομένων είναι η ίδια με το προηγούμενο σεμινάριο. Μπορείτε να εκτελέσετε τους κωδικούς και να μεταβείτε απευθείας στην αρχιτεκτονική του CNN.
Θα ακολουθήσετε τα παρακάτω βήματα για την ταξινόμηση εικόνων χρησιμοποιώντας το CNN:
- Βήμα 1: Μεταφόρτωση συνόλου δεδομένων
- Βήμα 2: Επίπεδο εισόδου
- Βήμα 3: Συνελικτικό στρώμα
- Βήμα 4: Poolinστρώση g
- Βήμα 5: Δεύτερο συνελικτικό στρώμα και Pooling Στρώμα
- Βήμα 6: Πυκνό στρώμα
- Βήμα 7: Logit Layer
Σημείωση έκδοσης: Οι παρακάτω καταχωρίσεις στοχεύουν στο TensorFlow 1.x. Στο TensorFlow 2, ο χώρος ονομάτων tf.layers και το tf.estimator.inputs.numpy_input_fn δεν υπάρχουν πλέον. Τα ισοδύναμα είναι tf.keras.layers.Conv2D, Max.PoolinΤα g2D, Dense και Dropout συναρμολογήθηκαν σε ένα tf.keras.Model και εκπαιδεύτηκαν με το model.fit(). Διαβάστε τα βήματα για τους μηχανισμούς κάθε επιπέδου και, στη συνέχεια, αντιστοιχίστε τα στο Keras API.
Βήμα 1: Μεταφόρτωση συνόλου δεδομένων
Το σύνολο δεδομένων MNIST είναι διαθέσιμο μέσω του scikit-learn. Παρακαλούμε κατεβάστε το και αποθηκεύστε το στις Λήψεις. Μπορείτε να το ανεβάσετε με την εντολή fetch_mldata('MNIST original').
Σημείωση έκδοσης: Το mldata.org έκλεισε και το fetch_mldata() αφαιρέθηκε στο scikit-learn 0.22. Σε οποιαδήποτε τρέχουσα εγκατάσταση, φορτώστε τα ίδια ψηφία με fetch_openml αντίθετα, χρησιμοποιώντας fetch_openml('mnist_784', έκδοση=1). Το υπόλοιπο της διοχέτευσης παραμένει αμετάβλητο.
Δημιουργήστε ένα σετ τρένου/δοκιμών
Πρέπει να διαχωρίσετε το σύνολο δεδομένων με την εντολή 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: Το επόμενο βήμα μετά τη συνέλιξη είναι η μείωση της δειγματοληψίας του χάρτη χαρακτηριστικών. Σκοπός είναι η μείωση της διαστασιολογίας του χάρτη χαρακτηριστικών για την αποφυγή υπερπροσαρμογής και τη βελτίωση της ταχύτητας υπολογισμού. Η μέγιστη ομαδοποίηση είναι η συμβατική τεχνική, η οποία διαιρεί τους χάρτες χαρακτηριστικών σε υποπεριοχές (συνήθως με μέγεθος 2×2) και διατηρεί μόνο τις μέγιστες τιμές.
- Πλήρως συνδεδεμένα στρώματα: Όλοι οι νευρώνες από τα προηγούμενα στρώματα συνδέονται με τα επόμενα στρώματα. Το CNN θα ταξινομήσει την ετικέτα σύμφωνα με τα χαρακτηριστικά από τα συνελικτικά στρώματα και θα μειωθεί με το στρώμα συγκέντρωσης.
Αρχιτεκτονική του CNN
- Συνελικτική Επίπεδο: Εφαρμόζει 14 φίλτρα 5×5 (π.χ.tracυποπεριοχές ting 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. Ας δούμε λεπτομερώς πώς να κατασκευάσετε κάθε δομικό στοιχείο πριν την αναδίπλωση.ping όλα μαζί στη συνάρτηση.
Βήμα 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 Στρώμα
Το δεύτερο συνελικτικό επίπεδο εφαρμόζει 36 φίλτρα, δίνοντας μέγεθος εξόδου [batch_size, 14, 14, 36]. Το επίπεδο ομαδοποίησης χρησιμοποιεί το ίδιο παράθυρο 2×2 και βήμα 2 όπως πριν, έτσι μειώνει στο μισό κάθε χωρικό άξονα και το σχήμα εξόδου γίνεται [batch_size, 7, 7, 36].
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: Πυκνό στρώμα
Στη συνέχεια, πρέπει να ορίσετε την πλήρως συνδεδεμένη στρώση. Ο χάρτης χαρακτηριστικών πρέπει να ισοπεδωθεί πριν συνδεθεί με την πυκνή στρώση. Μπορείτε να χρησιμοποιήσετε την αναδιαμόρφωση της ενότητας με μέγεθος 7*7*36.
Το πυκνό στρώμα θα συνδέσει 1,764 νευρώνες. Προσθέτετε μια συνάρτηση ενεργοποίησης ReLU. Επιπλέον, προσθέτετε έναν όρο κανονικοποίησης εγκατάλειψης με ρυθμό 0.3, που σημαίνει ότι το 30% των ενεργοποιήσεων θα οριστεί σε 0. Σημειώστε ότι η εγκατάλειψη λαμβάνει χώρα μόνο κατά τη φάση εκπαίδευσης. Η συνάρτηση cnn_model_fn έχει μια λειτουργία ορίσματος για να δηλώσει εάν το μοντέλο χρειάζεται εκπαίδευση ή αξιολόγηση, όπως φαίνεται στο παρακάτω παράδειγμα TensorFlow ταξινόμησης εικόνας CNN.
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() επιστρέφει τον δείκτη της υψηλότερης τιμής στο επίπεδο logits. Η συνάρτηση 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 είναι η βελτιστοποίηση του μοντέλου, δηλαδή η εύρεση των βέλτιστων τιμών των βαρών. Για αυτό, χρησιμοποιείτε έναν βελτιστοποιητή κλίσης με ρυθμό εκμάθησης 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)
Σημείωση σχετικά με τη συναρμολογημένη συνάρτηση: Η τυλιγμένη έκδοση παραπάνω ορίζει την πρώτη συνελικτική στρώση σε 32 φίλτρα και την απόρριψη σε 0.4, ενώ τα αποσπάσματα βήμα προς βήμα χρησιμοποιούν 14 φίλτρα και 0.3. Και τα δύο εκτελούνται, αλλά επιλέγουν ένα ζεύγος τιμών και το διατηρούν συνεπές, ώστε τα εκτυπωμένα σχήματα να ταιριάζουν με τον πίνακα στρώσεων.
Τα παρακάτω βήματα είναι τα ίδια με τα προηγούμενα σεμινάρια.
Πρώτα από όλα, ορίζετε έναν εκτιμητή με το μοντέλο 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}
Με την τρέχουσα αρχιτεκτονική, το λεξικό αξιολόγησης αναφέρει ακρίβεια 0.9689286, περίπου 97%. Μπορείτε να αλλάξετε την αρχιτεκτονική, το μέγεθος της παρτίδας και τον αριθμό των επαναλήψεων για να βελτιώσετε την ακρίβεια. Το CNN έχει αποδώσει πολύ καλύτερα από ένα τεχνητό νευρικό δίκτυο ή λογιστική παλινδρόμηση: στο σεμινάριο για τα τεχνητά νευρωνικά δίκτυα, είχατε ακρίβεια 96%, η οποία είναι χαμηλότερη από το CNN. Η απόδοση του CNN είναι εντυπωσιακή με ένα μεγαλύτερο σύνολο εικόνων, τόσο από άποψη ταχύτητας υπολογισμού όσο και ακρίβειας.











