Κατασκευή ενός 3D-CNN στο TensorFlow
Oktober 1, 2022Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.
Εισαγωγή στο 3D-CNN
Το σύνολο δεδομένων MNIST βοηθά τους αρχάριους να κατανοήσουν την έννοια και την εφαρμογή των Συνελικτικών Νευρωνικών Δικτύων. Πολλοί σκέφτονται τις εικόνες ως απλώς μια κανονική μήτρα, αλλά στην πραγματικότητα, αυτό δεν συμβαίνει. Οι εικόνες διαθέτουν αυτό που είναι γνωστό ως χωρική πληροφορία. Εξετάστε έναν πίνακα 3Χ3 που φαίνεται παρακάτω.
Σε έναν κανονικό πίνακα, οι τιμές του πίνακα θα είναι ανεξάρτητες η μία από την άλλη. Οι γειτονικές τιμές δεν θα φέρουν καμία σχέση ή πληροφορίες για ένα συγκεκριμένο πεδίο στον πίνακα. Για παράδειγμα, η τιμή που υπάρχει στη θέση του „e“ στον πίνακα δεν θα έχει καμία σύνδεση με τις τιμές που υπάρχουν σε άλλες θέσεις όπως „a“, „b“, κ.λπ. Αυτό δεν συμβαίνει σε μια εικόνα.
Σε μια εικόνα, κάθε θέση στη μήτρα αντιπροσωπεύει ένα εικονοστοιχείο στην εικόνα και η τιμή που υπάρχει σε κάθε θέση αντιπροσωπεύει την τιμή του εικονοστοιχείου. Η τιμή του εικονοστοιχείου μπορεί να είναι από [0-255] σε μια εικόνα 8 bit. Κάθε pixel έχει κάποια σχέση με τα γειτονικά του pixel. Η γειτονιά οποιουδήποτε pixel είναι το σύνολο των pixel που υπάρχουν γύρω του. Για κάθε εικονοστοιχείο, υπάρχουν 3 τρόποι να αναπαραστήσετε τη γειτονιά του, γνωστοί ως N-4, ND και N-8. Ας τα καταλάβουμε αναλυτικά.
- Ν-4: Αντιπροσωπεύει τα εικονοστοιχεία που υπάρχουν στο επάνω, κάτω, δεξιά και αριστερά του εικονοστοιχείου αναφοράς. Για το pixel „e“, το N-4 περιέχει „b“, „f“, „h“ και „d“.
- Η ΝΔ: Αντιπροσωπεύει τα εικονοστοιχεία που υπάρχουν διαγώνια προσβάσιμα από το εικονοστοιχείο αναφοράς. Για το pixel „e“, το ND περιέχει „a“, „c“, „i“ και „g“.
- Ν-8: Αντιπροσωπεύει όλα τα pixel που υπάρχουν γύρω του. Περιλαμβάνει τόσο N-4 όσο και ND pixel. Για το pixel „e“, το N-8 περιέχει „a“, „b“, „c“, „d“, „f“, „g“, „h“ και „i“.
Τα εικονοστοιχεία N-4, N-8 και ND βοηθούν στην εξαγωγή πληροφοριών για ένα pixel. Για παράδειγμα, αυτές οι παράμετροι μπορούν να χρησιμοποιηθούν για την ταξινόμηση ενός pixel είτε ως περίγραμμα είτε ως εσωτερικό ή εξωτερικό pixel. Αυτή είναι η ειδικότητα των εικόνων. Ένα ANN δέχεται είσοδο ως πίνακα 1D. Μια εικόνα υπάρχει πάντα σε έναν πίνακα 2D, με 1 ή περισσότερα κανάλια. Όταν ένας πίνακας εικόνων μετατρέπεται σε πίνακα 1D, χάνει χωρικές πληροφορίες και έτσι, ένα ANN αποτυγχάνει να συλλάβει αυτές τις πληροφορίες και αποδίδει κακώς σε ένα σύνολο δεδομένων εικόνας. Εδώ διαπρέπει ένα CNN. Ένα CNN δέχεται έναν πίνακα 2D ως είσοδο και εκτελεί μια λειτουργία συνέλιξης χρησιμοποιώντας μια μάσκα (ή ένα φίλτρο ή έναν πυρήνα) και εξάγει αυτά τα χαρακτηριστικά. Εκτελείται μια διαδικασία γνωστή ως ομαδοποίηση η οποία μειώνει τον αριθμό των χαρακτηριστικών που εξάγονται και μειώνει την υπολογιστική πολυπλοκότητα. Αφού εκτελέσουμε αυτές τις λειτουργίες, μετατρέπουμε τα εξαγόμενα χαρακτηριστικά σε έναν πίνακα 1D και τον τροφοδοτούμε στο τμήμα ANN που μαθαίνει να εκτελεί ταξινόμηση.
Το άρθρο στοχεύει να επεκτείνει την έννοια της λειτουργίας συνέλιξης σε τρισδιάστατα δεδομένα. Θα κατασκευάσουμε ένα τρισδιάστατο CNN που θα εκτελεί το κλασικό.
Επισκόπηση του συνόλου δεδομένων
Θα χρησιμοποιήσουμε το fulldatasetvectors.h5 αρχείο στο σύνολο δεδομένων. Αυτό το αρχείο έχει διανύσματα 4096-D που λαμβάνονται από την voxelization (x:16, y:16, z:16) όλων των νεφών τρισδιάστατων σημείων. Αυτό το αρχείο περιέχει 10000 προπονήσεις και 2000 δείγματα δοκιμής. Το σύνολο δεδομένων έχει επίσης δεδομένα νέφους σημείου που μπορούν να χρησιμοποιηθούν. Μια λεπτομερής επεξήγηση του συνόλου δεδομένων είναι διαθέσιμη εδώ. Μη διστάσετε να διαβάσετε περισσότερα σχετικά με το σύνολο δεδομένων πριν συνεχίσετε.
Εισαγωγή Ενοτήτων
Καθώς τα δεδομένα αποθηκεύονται σε h5 μορφή, θα χρησιμοποιήσουμε το h5py ενότητα για τη φόρτωση του συνόλου δεδομένων από τα δεδομένα από το αρχείο fulldatasetvectors. TensorFlow και Σκληρός θα χρησιμοποιηθεί για την κατασκευή και την εκπαίδευση του 3D-CNN. ο to_categorical Η συνάρτηση βοηθά στην εκτέλεση της κωδικοποίησης της μεταβλητής στόχου. Θα χρησιμοποιήσουμε επίσης την επανάκληση έγκαιρης διακοπής για να σταματήσουμε την εκπαίδευση και να αποτρέψουμε την υπερβολική τοποθέτηση του μοντέλου.
import numpy as np import h5py from tensorflow.keras.utils import to_categorical from tensorflow.keras import layers from tensorflow.keras.models import Sequential from tensorflow.keras.initializers import Constant from tensorflow.keras.optimizers import Adam from tensorflow.keras.callbacks import EarlyStopping
Φόρτωση του συνόλου δεδομένων
Όπως αναφέρθηκε προηγουμένως, θα φορτώνουμε δεδομένα από το αρχείο fulldatasetvectors.h5 χρησιμοποιώντας τη λειτουργική μονάδα h5py.
με h5py.File(‚../input/3d-mnist/full_dataset_vectors.h5‘, ‚r‘) ως σύνολο δεδομένων:
xtrain, xtest = σύνολο δεδομένων[“X_train”][:]σύνολο δεδομένων[“X_test”][:]
ytrain, ytest = σύνολο δεδομένων[“y_train”][:]σύνολο δεδομένων[“y_test”][:]
xtrain = np.array(xtrain)
xtest = np.array(xtest)
print(‚train shape:‘, xtrain.shape)
print(‚test shape:‘, xtest.shape)
xtrain = xtrain.reshape(xtrain.shape[0]16, 16, 16, 1)
xtest = xtest.reshape(xtest.shape[0]16, 16, 16, 1)
ytrain, ytest = to_categorical(ytrain, 10), to_categorical(ytest, 10)
We can see that the train data has 10000 samples while the test data has 2000 samples and each sample comprises 4096 features.
train shape: (10000, 4096) test shape: (2000, 4096)
Κατασκευή του 3D-CNN
Το 3D-CNN, όπως και κάθε κανονικό CNN, έχει 2 μέρη – τον εξαγωγέα χαρακτηριστικών και τον ταξινομητή ANN και λειτουργεί με τον ίδιο τρόπο. Το 3D-CNN, σε αντίθεση με το κανονικό CNN, εκτελεί τρισδιάστατη συνέλιξη αντί για 2D συνέλιξη. Θα χρησιμοποιήσουμε το διαδοχικό API από την Keras για τη δημιουργία του τρισδιάστατου CNN. Τα πρώτα 2 στρώματα θα είναι τα τρισδιάστατα συνελικτικά στρώματα με 32 φίλτρα και το ReLU ως λειτουργία ενεργοποίησης που θα ακολουθείται από ένα στρώμα max-pooling για μείωση διαστάσεων. Υπάρχει επίσης ένας όρος μεροληψίας που προστίθεται σε αυτά τα επίπεδα με τιμή 0,01. Από προεπιλογή, η τιμή πόλωσης έχει οριστεί στο 0. Χρησιμοποιείται ξανά το ίδιο σύνολο επιπέδων, αλλά με 64 φίλτρα. Στη συνέχεια ακολουθεί ένα στρώμα εγκατάλειψης και ένα επίπεδο επίπεδο. Το επίπεδο επίπεδο βοηθά στην αναμόρφωση των χαρακτηριστικών σε μια συστοιχία 1D που μπορεί να υποβληθεί σε επεξεργασία από ένα ANN, δηλαδή, πυκνά στρώματα. Το τμήμα ANN αποτελείται από 2 επίπεδα, με 256 και 128 νευρώνες αντίστοιχα, και το ReLU ως συνάρτηση ενεργοποίησης. Στη συνέχεια ακολουθεί ένα επίπεδο εξόδου με 10 νευρώνες, καθώς υπάρχουν 10 διαφορετικές κατηγορίες ή ετικέτες στο σύνολο δεδομένων.
model = Sequential() model.add(layers.Conv3D(32,(3,3,3),activation='relu',input_shape=(16,16,16,1),bias_initializer=Constant(0.01))) model.add(layers.Conv3D(32,(3,3,3),activation='relu',bias_initializer=Constant(0.01))) model.add(layers.MaxPooling3D((2,2,2))) model.add(layers.Conv3D(64,(3,3,3),activation='relu')) model.add(layers.Conv3D(64,(2,2,2),activation='relu')) model.add(layers.MaxPooling3D((2,2,2))) model.add(layers.Dropout(0.6)) model.add(layers.Flatten()) model.add(layers.Dense(256,'relu')) model.add(layers.Dropout(0.7)) model.add(layers.Dense(128,'relu')) model.add(layers.Dropout(0.5)) model.add(layers.Dense(10,'softmax')) model.summary()
Αυτή είναι η αρχιτεκτονική του 3D-CNN.
Model: "sequential_2" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv3d_5 (Conv3D) (None, 14, 14, 14, 32) 896 _________________________________________________________________ conv3d_6 (Conv3D) (None, 12, 12, 12, 32) 27680 _________________________________________________________________ max_pooling3d_2 (MaxPooling3 (None, 6, 6, 6, 32) 0 _________________________________________________________________ conv3d_7 (Conv3D) (None, 4, 4, 4, 64) 55360 _________________________________________________________________ conv3d_8 (Conv3D) (None, 3, 3, 3, 64) 32832 _________________________________________________________________ max_pooling3d_3 (MaxPooling3 (None, 1, 1, 1, 64) 0 _________________________________________________________________ dropout_4 (Dropout) (None, 1, 1, 1, 64) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 64) 0 _________________________________________________________________ dense_3 (Dense) (None, 256) 16640 _________________________________________________________________ dropout_5 (Dropout) (None, 256) 0 _________________________________________________________________ dense_4 (Dense) (None, 128) 32896 _________________________________________________________________ dropout_6 (Dropout) (None, 128) 0 _________________________________________________________________ dense_5 (Dense) (None, 10) 1290 ================================================================= Total params: 167,594 Trainable params: 167,594 Non-trainable params: 0
Εκπαίδευση του 3D-CNN
Θα χρησιμοποιήσουμε τον Adam ως βελτιστοποιητή. Η κατηγορική διασταυρούμενη εντροπία θα χρησιμοποιηθεί ως συνάρτηση απώλειας για την εκπαίδευση του μοντέλου, καθώς πρόκειται για ταξινόμηση πολλαπλών κλάσεων. Η ακρίβεια θα χρησιμοποιηθεί ως μέτρηση απώλειας για την προπόνηση. Όπως αναφέρθηκε προηγουμένως, η επανάκληση Earlystopping θα χρησιμοποιηθεί κατά την εκπαίδευση του μοντέλου μαζί με τα επίπεδα εγκατάλειψης. Η Earlystopping επανάκληση βοηθά στη διακοπή της διαδικασίας εκπαίδευσης όταν οποιαδήποτε παράμετρος όπως η απώλεια ή η ακρίβεια δεν βελτιωθεί σε έναν συγκεκριμένο αριθμό εποχών, κάτι που με τη σειρά του βοηθά στην αποφυγή της υπερβολικής προσαρμογής του μοντέλου. Οι εγκαταλείψεις βοηθούν στην αποφυγή της υπερβολικής προσαρμογής του μοντέλου απενεργοποιώντας τυχαία ορισμένους νευρώνες κατά την εκπαίδευση και κάνοντας το μοντέλο να μάθει και να μην απομνημονεύει. Η τιμή εγκατάλειψης δεν πρέπει να είναι πολύ υψηλή καθώς μπορεί να οδηγήσει σε υποκατάσταση του μοντέλου, κάτι που δεν είναι ιδανικό.
model.compile(Adam(0.001),'categorical_crossentropy',['accuracy']) model.fit(xtrain,ytrain,epochs=200,batch_size=32,verbose=1,validation_data=(xtest,ytest),callbacks=[EarlyStopping(patience=15)])
Αυτές είναι μερικές εποχές εκπαίδευσης του 3D-CNN.
Epoch 1/200 313/313 [==============================] - 39s 123ms/step - loss: 2.2782 - accuracy: 0.1237 - val_loss: 2.1293 - val_accuracy: 0.2235 Epoch 2/200 313/313 [==============================] - 39s 124ms/step - loss: 2.0718 - accuracy: 0.2480 - val_loss: 1.8067 - val_accuracy: 0.3395 Epoch 3/200 313/313 [==============================] - 39s 125ms/step - loss: 1.8384 - accuracy: 0.3382 - val_loss: 1.5670 - val_accuracy: 0.4260 ... ... Epoch 87/200 313/313 [==============================] - 39s 123ms/step - loss: 0.7541 - accuracy: 0.7327 - val_loss: 0.9970 - val_accuracy: 0.7061
Δοκιμή του 3D-CNN
Το 3D-CNN επιτυγχάνει αξιοπρεπή ακρίβεια 73,3% στο τρένο και 70,6% στα δεδομένα της δοκιμής. Η ακρίβεια μπορεί να είναι ελαφρώς στην κάτω πλευρά, καθώς το σύνολο δεδομένων είναι αρκετά μικρό και όχι ισορροπημένο.
_, acc = model.evaluate(xtrain, ytrain) print('training accuracy:', str(round(acc*100, 2))+'%') _, acc = model.evaluate(xtest, ytest) print('testing accuracy:', str(round(acc*100, 2))+'%')
313/313 [==============================] - 11s 34ms/step - loss: 0.7541 - accuracy: 0.7327 training accuracy: 73.27% 63/63 [==============================] - 2s 34ms/step - loss: 0.9970 - accuracy: 0.7060 testing accuracy: 70.61%
n
Συνοψίζοντας, αυτό το άρθρο κάλυψε τα ακόλουθα θέματα:
- Γείτονες ενός pixel σε μια εικόνα
- Γιατί ένα ANN έχει κακή απόδοση σε ένα σύνολο δεδομένων εικόνας
- Διαφορές μεταξύ ενός CNN και ενός ANN
- Λειτουργία του CNN
- Κατασκευή και εκπαίδευση ενός 3D-CNN στο TensorFlow
Για να συνεχιστεί περαιτέρω αυτό το έργο, μπορεί να δημιουργηθεί ένα νέο προσαρμοσμένο τρισδιάστατο σύνολο δεδομένων από το σύνολο δεδομένων MNIST προβάλλοντας τις τιμές των εικονοστοιχείων σε έναν άλλο άξονα. Ο άξονας x και ο άξονας y θα παραμείνουν ίδιοι όπως σε οποιαδήποτε εικόνα, αλλά οι τιμές των pixel θα προβάλλονται στον άξονα z. Αυτός ο μετασχηματισμός δημιουργίας τρισδιάστατων δεδομένων από δεδομένα 2D μπορεί να εφαρμοστεί μετά την εκτέλεση της αύξησης εικόνας, έτσι ώστε να έχουμε ένα καλά ισορροπημένο και γενικευμένο σύνολο δεδομένων που μπορεί να χρησιμοποιηθεί για την εκπαίδευση του 3D-CNN και την επίτευξη καλύτερης ακρίβειας. Αυτό είναι το τέλος αυτού του άρθρου. Ελπίζω να σας άρεσε η ανάγνωση αυτού του άρθρου.
Ευχαριστώ για την ανάγνωση και καλή μάθηση!
Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα.