Ταξινόμηση εικόνας TensorFlow: CNN (Convolutional Neural Network)

Πίνακας περιεχομένων:

Anonim

Τι είναι το Convolutional Neural Network;

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

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

Σε αυτό το σεμινάριο, θα μάθετε

  • Συγκροτητικό νευρικό δίκτυο
  • Αρχιτεκτονική ενός Συγκροτήματος Νευρωνικού Δικτύου
  • Συστατικά Convnets
  • Εκπαιδεύστε το CNN με το TensorFlow
  • Βήμα 1: Μεταφόρτωση συνόλου δεδομένων
  • Βήμα 2: Επίπεδο εισαγωγής
  • Βήμα 3: Συνθετικό στρώμα
  • Βήμα 4: Επίπεδο συγκέντρωσης
  • Βήμα 5: Δεύτερο στρώμα Convolutional και Pooling Layer
  • Βήμα 6: Πυκνό στρώμα
  • Βήμα 7: Logit Layer

Αρχιτεκτονική ενός Συγκροτήματος Νευρωνικού Δικτύου

Σκεφτείτε το Facebook πριν από λίγα χρόνια, αφού ανεβάσατε μια εικόνα στο προφίλ σας, σας ζητήθηκε να προσθέσετε ένα όνομα στο πρόσωπο στη φωτογραφία χειροκίνητα. Σήμερα, το Facebook χρησιμοποιεί το convnet για αυτόματη επισήμανση του φίλου σας στην εικόνα.

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

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

Μια εικόνα αποτελείται από μια σειρά pixel με ύψος και πλάτος. Μια εικόνα σε κλίμακα του γκρι έχει μόνο ένα κανάλι, ενώ η έγχρωμη εικόνα έχει τρία κανάλια (το καθένα για κόκκινο, πράσινο και μπλε). Ένα κανάλι στοιβάζεται το ένα πάνω στο άλλο. Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε μια εικόνα κλίμακας του γκρι με ένα μόνο κανάλι. Κάθε pixel έχει τιμή από 0 έως 255 για να αντικατοπτρίζει την ένταση του χρώματος. Για παράδειγμα, ένα pixel ίσο με 0 θα δείξει ένα λευκό χρώμα ενώ το pixel με τιμή κοντά στο 255 θα είναι πιο σκούρο.

Ας δούμε μια εικόνα που είναι αποθηκευμένη στο σύνολο δεδομένων MNIST. Η παρακάτω εικόνα δείχνει πώς να αντιπροσωπεύσετε την εικόνα του αριστερού σε μορφή μήτρας. Σημειώστε ότι, η αρχική μήτρα έχει τυποποιηθεί να κυμαίνεται μεταξύ 0 και 1. Για πιο σκούρο χρώμα, η τιμή στη μήτρα είναι περίπου 0,9, ενώ τα λευκά εικονοστοιχεία έχουν τιμή 0.

Διοικητική λειτουργία

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

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

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

Συστατικά Convnets

Υπάρχουν τέσσερα συστατικά ενός Convnets

  1. Περιελιγμός
  2. Μη γραμμικότητα (ReLU)
  3. Ομαδοποίηση ή υπο δειγματοληψία
  4. Ταξινόμηση (Πλήρως συνδεδεμένο στρώμα)
  • Περιελιγμός

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

Το Convolution είναι ένας πολλαπλασιασμός με στοιχεία. Η ιδέα είναι κατανοητή. Ο υπολογιστής θα σαρώσει ένα μέρος της εικόνας, συνήθως με διάσταση 3x3 και θα το πολλαπλασιάσει σε ένα φίλτρο. Η έξοδος του πολλαπλασιαστικού στοιχείου ονομάζεται χάρτης χαρακτηριστικών. Αυτό το βήμα επαναλαμβάνεται έως ότου σαρωθεί όλη η εικόνα. Σημειώστε ότι, μετά τη συνέλιξη, το μέγεθος της εικόνας μειώνεται.

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

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

Πηγή

Αριθμητική πίσω από τη συνέλιξη

Η συνελικτική φάση θα εφαρμόσει το φίλτρο σε μια μικρή σειρά εικονοστοιχείων μέσα στην εικόνα. Το φίλτρο θα μετακινηθεί κατά μήκος της εικόνας εισόδου με γενικό σχήμα 3x3 ή 5x5. Σημαίνει ότι το δίκτυο θα σύρει αυτά τα παράθυρα σε όλη την εικόνα εισόδου και θα υπολογίσει την επίλυση. Η παρακάτω εικόνα δείχνει τον τρόπο λειτουργίας της συνέλιξης. Το μέγεθος της επιδιόρθωσης είναι 3x3 και η μήτρα εξόδου είναι το αποτέλεσμα της λειτουργίας του στοιχείου μεταξύ της μήτρας εικόνας και του φίλτρου.

Πηγή

Παρατηρείτε ότι το πλάτος και το ύψος της εξόδου μπορεί να διαφέρουν από το πλάτος και το ύψος της εισόδου. Συμβαίνει λόγω του φαινομένου των συνόρων.

Συνοριακό αποτέλεσμα

Η εικόνα έχει έναν χάρτη λειτουργιών 5x5 και ένα φίλτρο 3x3. Υπάρχει μόνο ένα παράθυρο στο κέντρο όπου το φίλτρο μπορεί να εμφανίσει πλέγμα 3x3. Ο χάρτης χαρακτηριστικών εξόδου θα συρρικνωθεί κατά δύο πλακίδια παράλληλα με διάσταση 3x3.

Για να έχετε την ίδια διάσταση εξόδου με τη διάσταση εισόδου, πρέπει να προσθέσετε παραγέμισμα. Η επένδυση αποτελείται από την προσθήκη του σωστού αριθμού σειρών και στηλών σε κάθε πλευρά του πίνακα. Θα επιτρέψει στη συνέλιξη να χωρά στο κέντρο κάθε πλακιδίου εισόδου. Στην παρακάτω εικόνα, ο πίνακας εισόδου / εξόδου έχει την ίδια διάσταση 5x5

Όταν ορίζετε το δίκτυο, οι εμπλεκόμενες δυνατότητες ελέγχονται από τρεις παραμέτρους:

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

  1. Stride: Ορίζει τον αριθμό του "άλματος pixel" μεταξύ δύο φετών. Εάν το βήμα είναι ίσο με 1, τα παράθυρα θα μετακινηθούν με την εξάπλωση ενός pixel. Εάν το βήμα είναι ίσο με δύο, τα παράθυρα θα πηδήξουν κατά 2 pixel. Εάν αυξήσετε την πρόοδο, θα έχετε μικρότερους χάρτες χαρακτηριστικών.

Παράδειγμα άλλου 1

Βήμα εικόνας 2

  1. Zero-padding: Το padding είναι μια λειτουργία προσθήκης ενός αντίστοιχου αριθμού σειρών και στηλών σε κάθε πλευρά των χαρτών χαρακτηριστικών εισόδου. Σε αυτήν την περίπτωση, η έξοδος έχει την ίδια διάσταση με την είσοδο.
  2. Μη γραμμικότητα (ReLU)

Στο τέλος της λειτουργίας της συνέλιξης, η έξοδος υπόκειται σε λειτουργία ενεργοποίησης που επιτρέπει τη μη γραμμικότητα. Η συνήθης λειτουργία ενεργοποίησης για το convnet είναι το Relu. Όλα τα pixel με αρνητική τιμή θα αντικατασταθούν από μηδέν.

  • Μέγιστη συγκέντρωση

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

Σε αυτό το στάδιο, πρέπει να ορίσετε το μέγεθος και το βήμα. Ένας τυπικός τρόπος συγκέντρωσης της εικόνας εισαγωγής είναι να χρησιμοποιήσετε τη μέγιστη τιμή του χάρτη χαρακτηριστικών. Κοιτάξτε την παρακάτω εικόνα. Το "pooling" θα εμφανίσει τέσσερις υπομέτρους του χάρτη χαρακτηριστικών 4x4 και θα επιστρέψει τη μέγιστη τιμή. Η συγκέντρωση παίρνει τη μέγιστη τιμή ενός πίνακα 2x2 και, στη συνέχεια, μετακινήστε αυτά τα παράθυρα κατά δύο pixel. Για παράδειγμα, η πρώτη υπο-μήτρα είναι [3,1,3,2], η συγκέντρωση θα επιστρέψει το μέγιστο, που είναι 3.

Υπάρχει μια άλλη λειτουργία συγκέντρωσης, όπως η μέση τιμή.

Αυτή η λειτουργία μειώνει επιθετικά το μέγεθος του χάρτη χαρακτηριστικών

  • Πλήρως συνδεδεμένα στρώματα

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

Ανακεφαλαιώσουμε:

Το δίκτυο Convolutional Neural συγκεντρώνει διαφορετικά επίπεδα πριν κάνει μια πρόβλεψη. Ένα νευρικό δίκτυο έχει:

  • Ένα συνελικτικό στρώμα
  • Λειτουργία ενεργοποίησης Relu
  • Επίπεδο συγκέντρωσης
  • Πυκνά συνδεδεμένο στρώμα

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

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

Εκπαιδεύστε το CNN με το TensorFlow

Τώρα που είστε εξοικειωμένοι με το δομικό στοιχείο των connets, είστε έτοιμοι να δημιουργήσετε ένα με το TensorFlow. Θα χρησιμοποιήσουμε το σύνολο δεδομένων MNIST για την ταξινόμηση εικόνας.

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

Θα ακολουθήσετε τα παρακάτω βήματα:

Βήμα 1: Μεταφόρτωση συνόλου δεδομένων

Βήμα 2: Επίπεδο εισαγωγής

Βήμα 3: Συνθετικό στρώμα

Βήμα 4: Επίπεδο συγκέντρωσης

Βήμα 5: Δεύτερο στρώμα Convolutional και Pooling Layer

Βήμα 6: Πυκνό στρώμα

Βήμα 7: Logit Layer

Βήμα 1: Μεταφόρτωση συνόλου δεδομένων

Το σύνολο δεδομένων MNIST είναι διαθέσιμο με scikit για να μάθετε σε αυτήν τη διεύθυνση URL. Κατεβάστε το και αποθηκεύστε το στις Λήψεις. Μπορείτε να το ανεβάσετε με fetch_mldata ("MNIST original").

Δημιουργήστε ένα σετ τρένων / δοκιμών

Πρέπει να διαχωρίσετε το σύνολο δεδομένων με train_test_split

Κλιμάκωση των χαρακτηριστικών

Τέλος, μπορείτε να κλιμακώσετε τη λειτουργία με το MinMaxScaler

import numpy as npimport tensorflow as tffrom sklearn.datasets import fetch_mldata#Change USERNAME by the username of your machine## Windows USERmnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original')## Mac Usermnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original')print(mnist.data.shape)print(mnist.target.shape)from sklearn.model_selection import train_test_splitX_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 )## resclaefrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()# TrainX_train_scaled = scaler.fit_transform(X_train.astype(np.float64))# testX_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 χρησιμοποιεί φίλτρα στο ακατέργαστο εικονοστοιχείο μιας εικόνας για να μάθει μοτίβο λεπτομερειών σε σύγκριση με το παγκόσμιο μοτίβο με ένα παραδοσιακό νευρικό δίχτυ. Για να δημιουργήσετε ένα CNN, πρέπει να ορίσετε:

  1. Ένα συνελικτικό επίπεδο: Εφαρμόστε n αριθμό φίλτρων στο χάρτη χαρακτηριστικών Μετά τη συνέλιξη, πρέπει να χρησιμοποιήσετε μια λειτουργία ενεργοποίησης Relu για να προσθέσετε μη γραμμικότητα στο δίκτυο.
  2. Επίπεδο συγκέντρωσης: Το επόμενο βήμα μετά τη συνέλιξη είναι να υποτιμήσετε τη μέγιστη δυνατότητα. Ο σκοπός είναι να μειωθεί η διάσταση του χάρτη χαρακτηριστικών για να αποφευχθεί η υπερβολική τοποθέτηση και να βελτιωθεί η ταχύτητα υπολογισμού. Η μέγιστη συγκέντρωση είναι η συμβατική τεχνική, η οποία χωρίζει τους χάρτες χαρακτηριστικών σε υποπεριοχές (συνήθως με μέγεθος 2x2) και διατηρεί μόνο τις μέγιστες τιμές.
  3. Πλήρως συνδεδεμένα στρώματα: Όλοι οι νευρώνες από τα προηγούμενα στρώματα συνδέονται με τα επόμενα στρώματα. Το CNN θα ταξινομήσει την ετικέτα σύμφωνα με τα χαρακτηριστικά από τα συνελικτικά στρώματα και θα μειωθεί με το στρώμα συγκέντρωσης.

Αρχιτεκτονική CNN

  • Convolutional Layer: Εφαρμόζει 14 φίλτρα 5x5 (εξαγωγή υποπεριοχών 5x5-pixel), με λειτουργία ενεργοποίησης ReLU
  • Pooling Layer: Εκτελεί μέγιστη συγκέντρωση με φίλτρο 2x2 και βήμα 2 (που καθορίζει ότι οι συγκεντρωτικές περιοχές δεν αλληλεπικαλύπτονται)
  • Convolutional Layer: Εφαρμόζει 36 φίλτρα 5x5, με λειτουργία ενεργοποίησης ReLU
  • Pooling Layer # 2: Και πάλι, εκτελεί μέγιστη συγκέντρωση με φίλτρο 2x2 και βήμα 2
  • 1.764 νευρώνες, με ρυθμό κανονικής εγκατάλειψης 0,4 (πιθανότητα 0,4 ότι οποιοδήποτε δεδομένο στοιχείο θα πέσει κατά τη διάρκεια της προπόνησης)
  • Dense Layer (Logits Layer): 10 νευρώνες, ένας για κάθε κλάση στόχου ψηφίων (0-9).

Υπάρχουν τρεις σημαντικές ενότητες που πρέπει να χρησιμοποιήσετε για τη δημιουργία ενός CNN:

  • conv2d (). Κατασκευάζει ένα δισδιάστατο συνελικτικό επίπεδο με τον αριθμό των φίλτρων, το μέγεθος του πυρήνα του φίλτρου, το padding και τη λειτουργία ενεργοποίησης ως ορίσματα.
  • max_pooling2d (). Κατασκευάζει ένα δισδιάστατο επίπεδο συγκέντρωσης χρησιμοποιώντας τον αλγόριθμο μέγιστης συγκέντρωσης.
  • πυκνός(). Κατασκευάζει ένα πυκνό στρώμα με τα κρυφά στρώματα και μονάδες

Θα ορίσετε μια συνάρτηση για τη δημιουργία του CNN. Ας δούμε λεπτομερώς πώς να κατασκευάσουμε κάθε δομικό στοιχείο πριν να τυλίξουμε τα πάντα στη λειτουργία.

Βήμα 2: Επίπεδο εισαγωγής

def cnn_model_fn(features, labels, mode):input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

Πρέπει να ορίσετε έναν τανυστή με το σχήμα των δεδομένων. Για αυτό, μπορείτε να χρησιμοποιήσετε την ενότητα tf.reshape. Σε αυτήν την ενότητα, πρέπει να δηλώσετε ότι ο τανυστής θα αναμορφωθεί και το σχήμα του τανυστή. Το πρώτο όρισμα είναι τα χαρακτηριστικά των δεδομένων, τα οποία ορίζονται στο όρισμα της συνάρτησης.

Μια εικόνα έχει ύψος, πλάτος και κανάλι. Το σύνολο δεδομένων MNIST είναι μια μονοχρονική εικόνα με μέγεθος 28x28. Ρυθμίζουμε το μέγεθος παρτίδας σε -1 στο όρισμα σχήματος έτσι ώστε να παίρνει το σχήμα των χαρακτηριστικών ["x"]. Το πλεονέκτημα είναι να ρυθμιστούν οι υπέρμετροι μεγέθους παρτίδας. Εάν το μέγεθος παρτίδας έχει οριστεί σε 7, τότε ο τανυστής θα τροφοδοτήσει 5.488 τιμές (28 * 28 * 7).

Step 3: Convolutional layer
# first Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=14,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)

Το πρώτο συνελικτικό στρώμα έχει 14 φίλτρα με μέγεθος πυρήνα 5x5 με την ίδια επένδυση. Η ίδια επένδυση σημαίνει ότι τόσο ο τανυστής εξόδου όσο και ο τανυστής εισόδου πρέπει να έχουν το ίδιο ύψος και πλάτος. Το Tensorflow θα προσθέσει μηδενικά στις σειρές και τις στήλες για να εξασφαλίσει το ίδιο μέγεθος.

Χρησιμοποιείτε τη λειτουργία ενεργοποίησης Relu. Το μέγεθος εξόδου θα είναι [28, 28, 14].

Βήμα 4: Επίπεδο συγκέντρωσης

Το επόμενο βήμα μετά τη συνέλιξη είναι ο υπολογισμός συγκέντρωσης. Ο υπολογισμός ομαδοποίησης θα μειώσει τη διάσταση των δεδομένων. Μπορείτε να χρησιμοποιήσετε τη μονάδα max_pooling2d με μέγεθος 2x2 και βήμα 2. Χρησιμοποιείτε το προηγούμενο επίπεδο ως είσοδο. Το μέγεθος εξόδου θα είναι [batch_size, 14, 14, 14]

# first Pooling Layerpool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

Βήμα 5: Δεύτερο στρώμα Convolutional και Pooling Layer

Το δεύτερο συνελικτικό επίπεδο έχει 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: Πυκνό στρώμα

Στη συνέχεια, πρέπει να ορίσετε το πλήρως συνδεδεμένο επίπεδο. Ο χάρτης χαρακτηριστικών πρέπει να ισιώσει πριν συνδεθεί με το πυκνό στρώμα. Μπορείτε να χρησιμοποιήσετε την αναδιαμόρφωση της μονάδας με μέγεθος 7 * 7 * 36.

Το πυκνό στρώμα θα συνδέσει 1764 νευρώνες. Προσθέτετε μια λειτουργία ενεργοποίησης Relu. Εκτός αυτού, προσθέτετε έναν όρο κανονικοποίησης εγκατάλειψης με ρυθμό 0,3, που σημαίνει ότι 30% των βαρών θα οριστούν σε 0. Σημειώστε ότι, η εγκατάλειψη πραγματοποιείται μόνο κατά τη φάση της προπόνησης. Η συνάρτηση cnn_model_fn έχει λειτουργία ορίσματος για να δηλώσει εάν το μοντέλο πρέπει να εκπαιδευτεί ή να αξιολογήσει.

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

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

# Logits Layerlogits = tf.layers.dense(inputs=dropout, units=10) 

Μπορείτε να δημιουργήσετε ένα λεξικό που περιέχει τα μαθήματα και την πιθανότητα κάθε τάξης. Το module tf.argmax () με επιστρέφει την υψηλότερη τιμή εάν τα logit στρώματα. Η συνάρτηση softmax επιστρέφει την πιθανότητα κάθε κλάσης.

predictions = {# Generate predictions"classes": tf.argmax(input=logits, axis=1),"probabilities": tf.nn.softmax(logits, name="softmax_tensor") }

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

if mode == tf.estimator.ModeKeys.PREDICT:return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

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

# Calculate Loss (for both TRAIN and EVAL modes)loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

Το τελευταίο βήμα είναι να βελτιστοποιήσετε το μοντέλο, δηλαδή να βρείτε τις καλύτερες τιμές των βαρών. Για αυτό, χρησιμοποιείτε ένα 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 Layerinput_layer = tf.reshape(features["x"], [-1, 28, 28, 1])# Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=32,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)# Pooling Layerpool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)# Convolutional Layer #2 and Pooling Layerconv2 = 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 Layerpool2_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 Layerlogits = 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 Lossloss = 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 modeeval_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 Estimatormnist_classifier = tf.estimator.Estimator(model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")

Ένα CNN διαρκεί πολλές φορές για να εκπαιδεύσετε, επομένως, δημιουργείτε ένα γάντζο καταγραφής για να αποθηκεύετε τις τιμές των επιπέδων softmax κάθε 50 επαναλήψεις.

# Set up logging for predictionstensors_to_log = {"probabilities": "softmax_tensor"}logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)

Είστε έτοιμοι να εκτιμήσετε το μοντέλο. Ορίζετε ένα μέγεθος παρτίδας 100 και ανακατεύετε τα δεδομένα. Σημειώστε ότι έχουμε ορίσει βήματα εκπαίδευσης 16.000, μπορεί να χρειαστεί πολύς χρόνος για την προπόνηση. Κάνε υπομονή.

# Train the modeltrain_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 resultseval_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:41INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56INFO: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 είναι εντυπωσιακές με ένα μεγαλύτερο σύνολο εικόνων , τόσο όσον αφορά τον υπολογισμό της ταχύτητας όσο και την ακρίβεια.

Περίληψη

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

Για να δημιουργήσετε ένα CNN, πρέπει να ακολουθήσετε έξι βήματα:

Βήμα 1: Επίπεδο εισαγωγής:

Αυτό το βήμα αναδιαμορφώνει τα δεδομένα. Το σχήμα είναι ίσο με την τετραγωνική ρίζα του αριθμού των pixel. Για παράδειγμα, εάν μια εικόνα έχει 156 pixel, τότε το σχήμα είναι 26x26. Πρέπει να καθορίσετε εάν η εικόνα έχει χρώμα ή όχι. Εάν ναι, τότε είχατε 3 στο σχήμα - 3 για RGB-, διαφορετικά 1.

input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1]) 

Βήμα 2: Συνθετικό στρώμα

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

conv1 = tf.layers.conv2d(inputs=input_layer,filters=14,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)

Βήμα 3: Επίπεδο συγκέντρωσης

Στο τρίτο βήμα, προσθέτετε ένα επίπεδο συγκέντρωσης. Αυτό το επίπεδο μειώνει το μέγεθος της εισόδου. Αυτό το κάνει λαμβάνοντας τη μέγιστη τιμή του υπο-μήτρας. Για παράδειγμα, εάν η υπο-μήτρα είναι [3,1,3,2], η συγκέντρωση θα επιστρέψει το μέγιστο, που είναι 3.

pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) 

Βήμα 4: Προσθέστε Convolutional Layer και Pooling Layer

Σε αυτό το βήμα, μπορείτε να προσθέσετε όσα θέλετε τα επίπεδα μετατροπών και τα επίπεδα συγκέντρωσης. Η Google χρησιμοποιεί αρχιτεκτονική με περισσότερα από 20 επίπεδα μετατροπών.

Βήμα 5: Πυκνό στρώμα

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

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)

Βήμα 6: Logit Layer

Το τελευταίο βήμα είναι η πρόβλεψη.

logits = tf.layers.dense(inputs=dropout, units=10)