Μην χρησιμοποιείτε το Flatten() - Global Pooling για CNN με TensorFlow και Keras PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Μην χρησιμοποιείτε το Flatten() – Global Pooling για CNN με TensorFlow και Keras

Οι περισσότεροι επαγγελματίες, ενώ μαθαίνουν πρώτα για τις αρχιτεκτονικές του Συνελικτικού Νευρωνικού Δικτύου (CNN) – μαθαίνουν ότι αποτελείται από τρία βασικά τμήματα:

  • Συνελικτικά στρώματα
  • Στρώματα συγκέντρωσης
  • Πλήρως συνδεδεμένα στρώματα

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

Αυτό ήταν ο κανόνας και γνωστές αρχιτεκτονικές όπως το VGGNets χρησιμοποιούσαν αυτήν την προσέγγιση και θα κατέληγαν σε:

model = keras.Sequential([
    
    keras.layers.MaxPooling2D((2, 2), strides=(2, 2), padding='same'),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'), 
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dense(n_classes, activation='softmax')
])

Αν και, για κάποιο λόγο – πολλές φορές ξεχνιέται ότι το VGGNet ήταν πρακτικά η τελευταία αρχιτεκτονική που χρησιμοποίησε αυτή την προσέγγιση, λόγω του προφανούς υπολογιστικού φραγμού που δημιουργεί. Μόλις το ResNets, που δημοσιεύτηκε μόλις το έτος μετά το VGGNets (και πριν από 7 χρόνια), όλες οι κύριες αρχιτεκτονικές τερμάτισαν τους ορισμούς μοντέλων τους με:

model = keras.Sequential([
    
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(n_classes, activation='softmax')
])

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

Η παγκόσμια μέση συγκέντρωση είναι προτιμότερη σε πολλούς λογαριασμούς από την ισοπέδωση. Εάν κάνετε πρωτότυπο ένα μικρό CNN - χρησιμοποιήστε το Global Pooling. Εάν διδάσκετε κάποιον για τα CNN - χρησιμοποιήστε το Global Pooling. Εάν κάνετε MVP - χρησιμοποιήστε το Global Pooling. Χρησιμοποιήστε στρώσεις ισοπέδωσης για άλλες περιπτώσεις χρήσης όπου πραγματικά χρειάζονται.

Μελέτη περίπτωσης – Flattening vs Global Pooling

Το Global Pooling συμπυκνώνει όλους τους χάρτες χαρακτηριστικών σε έναν ενιαίο, συγκεντρώνοντας όλες τις σχετικές πληροφορίες σε έναν ενιαίο χάρτη που μπορεί να γίνει εύκολα κατανοητός από ένα μόνο πυκνό στρώμα ταξινόμησης αντί για πολλαπλά επίπεδα. Συνήθως εφαρμόζεται ως μέση συγκέντρωση (GlobalAveragePooling2D) ή μέγιστη συγκέντρωση (GlobalMaxPooling2D) και μπορεί να λειτουργήσει και για είσοδο 1D και 3D.

Αντί να ισοπεδώνετε έναν χάρτη χαρακτηριστικών όπως π.χ (7, 7, 32) σε ένα διάνυσμα μήκους 1536 και εκπαιδεύοντας ένα ή πολλαπλά στρώματα για να διακρίνουμε μοτίβα από αυτό το μακρύ διάνυσμα: μπορούμε να το συμπυκνώσουμε σε (7, 7) διάνυσμα και ταξινομήστε απευθείας από εκεί. Είναι τόσο απλό!

Σημειώστε ότι τα επίπεδα συμφόρησης για δίκτυα όπως το ResNets μετρούν σε δεκάδες χιλιάδες δυνατότητες, όχι απλώς σε 1536. Όταν ισοπεδώνετε, βασανίζετε το δίκτυό σας για να μάθετε από διανύσματα παράξενου σχήματος με πολύ αναποτελεσματικό τρόπο. Φανταστείτε μια εικόνα 2D να κόβεται σε κάθε σειρά pixel και στη συνέχεια να ενώνεται σε ένα επίπεδο διάνυσμα. Τα δύο pixel που απείχαν 0 pixel κάθετα μεταξύ τους δεν είναι feature_map_width pixel μακριά οριζόντια! Αν και αυτό μπορεί να μην έχει πάρα πολύ σημασία για έναν αλγόριθμο ταξινόμησης, ο οποίος ευνοεί τη χωρική αναλλοίωτη - αυτό δεν θα ήταν καν εννοιολογικά καλό για άλλες εφαρμογές της όρασης υπολογιστή.

Ας ορίσουμε ένα μικρό επιδεικτικό δίκτυο που χρησιμοποιεί ένα επίπεδο ισοπέδωσης με μερικά πυκνά στρώματα:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.summary()

Πώς φαίνεται η περίληψη;

...                                                              
 dense_6 (Dense)             (None, 10)                330       
                                                                 
=================================================================
Total params: 11,574,090
Trainable params: 11,573,898
Non-trainable params: 192
_________________________________________________________________

11.5 εκατομμύρια παράμετροι για ένα δίκτυο παιχνιδιών – και παρακολουθήστε τις παραμέτρους να εκρήγνυνται με μεγαλύτερη είσοδο. 11.5M παράμετροι. Το EfficientNets, ένα από τα δίκτυα με τις καλύτερες επιδόσεις που σχεδιάστηκε ποτέ, λειτουργεί με παραμέτρους ~ 6M και δεν μπορεί να συγκριθεί με αυτό το απλό μοντέλο όσον αφορά την πραγματική απόδοση και την ικανότητα μάθησης από δεδομένα.

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

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

Ακολουθεί ένα δίκτυο με παγκόσμια συγκέντρωση:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(10, activation='softmax')
])

model.summary()

Περίληψη?

 dense_8 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 66,602
Trainable params: 66,410
Non-trainable params: 192
_________________________________________________________________

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

Going Further – Hand-held End-to-End Project

Η περιπετειώδης φύση σας σας κάνει να θέλετε να πάτε παραπέρα; Σας προτείνουμε να ελέγξετε το δικό μας Καθοδηγούμενο Έργο: «Συνελικτικά νευρωνικά δίκτυα – πέρα ​​από τις βασικές αρχιτεκτονικές».

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Θα σας ταξιδέψω στο χρόνο – πηγαίνοντας από το 1998 έως το 2022, επισημαίνοντας τις καθοριστικές αρχιτεκτονικές που αναπτύχθηκαν όλα αυτά τα χρόνια, τι τις έκανε μοναδικές, ποια είναι τα μειονεκτήματά τους και θα εφαρμόσετε τις αξιοσημείωτες από την αρχή. Δεν υπάρχει τίποτα καλύτερο από το να έχετε λίγη βρωμιά στα χέρια σας όταν πρόκειται για αυτά.

Μπορείτε να οδηγείτε ένα αυτοκίνητο χωρίς να γνωρίζετε αν ο κινητήρας έχει 4 ή 8 κυλίνδρους και ποια είναι η τοποθέτηση των βαλβίδων μέσα στον κινητήρα. Ωστόσο – εάν θέλετε να σχεδιάσετε και να εκτιμήσετε έναν κινητήρα (μοντέλο όρασης υπολογιστή), θα θέλετε να πάτε λίγο πιο βαθιά. Ακόμα κι αν δεν θέλετε να αφιερώσετε χρόνο σχεδιάζοντας αρχιτεκτονικές και θέλετε να δημιουργήσετε προϊόντα, αυτό που θέλουν οι περισσότεροι να κάνουν – θα βρείτε σημαντικές πληροφορίες σε αυτό το μάθημα. Θα μάθετε γιατί η χρήση απαρχαιωμένων αρχιτεκτονικών όπως το VGGNet θα βλάψει το προϊόν και την απόδοσή σας, και γιατί θα πρέπει να τις παραλείψετε εάν κατασκευάζετε οτιδήποτε σύγχρονο, και θα μάθετε σε ποιες αρχιτεκτονικές μπορείτε να απευθυνθείτε για την επίλυση πρακτικών προβλημάτων και τι τα υπέρ και τα κατά είναι για το καθένα.

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

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

Συμπέρασμα

Σε αυτόν τον σύντομο οδηγό, ρίξαμε μια ματιά σε μια εναλλακτική λύση για την ισοπέδωση στον σχεδιασμό της αρχιτεκτονικής του CNN. Αν και σύντομος – ο οδηγός αντιμετωπίζει ένα κοινό ζήτημα κατά το σχεδιασμό πρωτοτύπων ή MVP και σας συμβουλεύει να χρησιμοποιήσετε μια καλύτερη εναλλακτική λύση για την ισοπέδωση.

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

Εάν εισέλθετε στο Computer Vision - κάντε τη χάρη στον εαυτό σας και μην χρησιμοποιείτε επίπεδα ισοπέδωσης πριν από τις κεφαλές ταξινόμησης στο μαθησιακό σας ταξίδι.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse