Ένας διαισθητικός οδηγός για Convolutional Neural Networks

Σε αυτό το άρθρο, θα διερευνήσουμε Convolutional Neural Networks (CNNs) και, σε υψηλό επίπεδο, θα εξετάσουμε πώς εμπνέονται από τη δομή του εγκεφάλου. Εάν θέλετε να διαβάσετε περισσότερα για τον εγκέφαλο συγκεκριμένα, υπάρχουν περισσότεροι πόροι στο τέλος του άρθρου για να σας βοηθήσουμε περαιτέρω.

Ο εγκέφαλος

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

Πιθανότατα σκεφτήκατε κάτι σαν «ένα χαρούμενο μικρό παιδί που στέκεται σε μια καρέκλα» Ή ίσως νομίζατε ότι μοιάζει να ουρλιάζει, πρόκειται να επιτεθεί σε αυτό το κέικ μπροστά του.

Αυτό κάνουμε υποσυνείδητα όλη την ημέρα. Βλέπουμε, επισημαίνουμε, κάνουμε προβλέψεις και αναγνωρίζουμε μοτίβα. Αλλά πώς το κάνουμε αυτό; Πώς μπορούμε να ερμηνεύσουμε όλα όσα βλέπουμε;

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

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

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

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

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

Συγκροτήματα Νευρωνικά Δίκτυα

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

Οι υπολογιστές «βλέπουν» με διαφορετικό τρόπο από εμάς. Ο κόσμος τους αποτελείται από μόνο αριθμούς. Κάθε εικόνα μπορεί να αναπαρασταθεί ως δισδιάστατος πίνακας αριθμών, γνωστός ως pixel.

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

Για να διδάξουμε έναν αλγόριθμο πώς να αναγνωρίζουμε αντικείμενα σε εικόνες, χρησιμοποιούμε έναν συγκεκριμένο τύπο Artificial Neural Network: ένα Convolutional Neural Network (CNN). Το όνομά τους προέρχεται από μία από τις πιο σημαντικές λειτουργίες του δικτύου: συνέλιξη.

Τα συμπαγικά νευρικά δίκτυα εμπνέονται από τον εγκέφαλο. Η έρευνα της δεκαετίας του 1950 και του 1960 από τους DH Hubel και TN Wiesel στον εγκέφαλο των θηλαστικών πρότεινε ένα νέο μοντέλο για το πώς τα θηλαστικά αντιλαμβάνονται τον κόσμο οπτικά. Έδειξαν ότι ο οπτικός φλοιός γάτας και πιθήκου περιλαμβάνει νευρώνες που αποκρίνονται αποκλειστικά στους νευρώνες στο άμεσο περιβάλλον τους.

Στην εργασία τους, περιέγραψαν δύο βασικούς τύπους οπτικών κυττάρων νευρώνων στον εγκέφαλο που καθένας ενεργεί με διαφορετικό τρόπο: απλά κύτταρα ( κύτταρα S ) και σύνθετα κύτταρα ( κύτταρα C ).

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

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

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

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

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

Αργότερα, το 1998, το Convolutional Neural Networks εισήχθη σε ένα έγγραφο από τους Bengio, Le Cun, Bottou και Haffner. Το πρώτο τους Convolutional Neural Network ονομάστηκε LeNet-5 και κατάφερε να ταξινομήσει ψηφία από χειρόγραφους αριθμούς.

Για όλη την ιστορία του Convolutional Neural Nets, μπορείτε να πάτε εδώ.

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

Στο υπόλοιπο αυτού του άρθρου, θα σας καθοδηγήσω στην αρχιτεκτονική ενός CNN και θα σας δείξω επίσης την εφαρμογή Python.

Τα Convolutional Neural Networks έχουν διαφορετική αρχιτεκτονική από τα κανονικά Neural Networks. Τα κανονικά νευρικά δίκτυα μεταμορφώνουν μια είσοδο τοποθετώντας την μέσα από μια σειρά κρυφών επιπέδων. Κάθε στρώμα αποτελείται από ένα σύνολο νευρώνων , όπου κάθε στρώμα είναι πλήρως συνδεδεμένο με όλους τους νευρώνες στο στρώμα πριν. Τέλος, υπάρχει ένα τελευταίο πλήρως συνδεδεμένο επίπεδο - το επίπεδο εξόδου - που αντιπροσωπεύει τις προβλέψεις.

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

Τα CNN έχουν δύο συστατικά:

  • Το κρυφό στρώμα / μέρος εξαγωγής χαρακτηριστικών

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

  • Το τμήμα ταξινόμησης

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

# before we start building we import the libraries
import numpy as np
from keras.layers import Conv2D, Activation, MaxPool2D, Flatten, Densefrom keras.models import Sequential

Εξαγωγή χαρακτηριστικών

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

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

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

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

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

Για λόγους εξήγησης, σας έδειξα τη λειτουργία σε 2D, αλλά στην πραγματικότητα οι συνελεύσεις εκτελούνται σε 3D. Κάθε εικόνα αντιπροσωπεύεται συγκεκριμένα ως μήτρα 3D με διάσταση για πλάτος, ύψος και βάθος. Το βάθος είναι μια διάσταση λόγω των χρωμάτων που χρησιμοποιούνται σε μια εικόνα (RGB).

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

Όπως και κάθε άλλο Neural Network, χρησιμοποιούμε μια λειτουργία ενεργοποίησης για να κάνουμε την έξοδο μας μη γραμμική. Στην περίπτωση ενός Convolutional Neural Network, η έξοδος της συνέλιξης θα περάσει μέσω της λειτουργίας ενεργοποίησης. Αυτή θα μπορούσε να είναι η λειτουργία ενεργοποίησης ReLU.

Stride is the size of the step the convolution filter moves each time. A stride size is usually 1, meaning the filter slides pixel by pixel. By increasing the stride size, your filter is sliding over the input with a larger interval and thus has less overlap between the cells.

The animation below shows stride size 1 in action.

Because the size of the feature map is always smaller than the input, we have to do something to prevent our feature map from shrinking. This is where we use padding.

A layer of zero-value pixels is added to surround the input with zeros, so that our feature map will not shrink. In addition to keeping the spatial size constant after performing convolution, padding also improves performance and makes sure the kernel and stride size will fit in the input.

After a convolution layer, it is common to add a pooling layer in between CNN layers. The function of pooling is to continuously reduce the dimensionality to reduce the number of parameters and computation in the network. This shortens the training time and controls overfitting.

The most frequent type of pooling is max pooling,which takes the maximum value in each window. These window sizes need to be specified beforehand. This decreases the feature map size while at the same time keeping the significant information.

Thus when using a CNN, the four important hyperparameters we have to decide on are:

  • the kernel size
  • the filter count (that is, how many filters do we want to use)
  • stride (how big are the steps of the filter)
  • padding
# Images fed into this model are 512 x 512 pixels with 3 channels
img_shape = (28,28,1)
# Set up the model
model = Sequential()
# Add convolutional layer with 3, 3 by 3 filters and a stride size of 1# Set padding so that input size equals output size
model.add(Conv2D(6,2,input_shape=img_shape))
# Add relu activation to the layer 
model.add(Activation('relu'))
#Pooling
model.add(MaxPool2D(2))

A nice way of visualizing a convolution layer is shown below. Try to look at it for a bit and really understand what is happening.

Classification

After the convolution and pooling layers, our classification part consists of a few fully connected layers. However, these fully connected layers can only accept 1 Dimensional data. To convert our 3D data to 1D, we use the function flatten in Python. This essentially arranges our 3D volume into a 1D vector.

The last layers of a Convolutional NN are fully connected layers. Neurons in a fully connected layer have full connections to all the activations in the previous layer. This part is in principle the same as a regular Neural Network.

#Fully connected layers
# Use Flatten to convert 3D data to 1Dmodel.add(Flatten())
# Add dense layer with 10 neuronsmodel.add(Dense(10))
# we use the softmax activation function for our last layermodel.add(Activation('softmax'))
# give an overview of our model
model.summary
_________________________________________________________________Layer (type) Output Shape Param # =================================================================conv2d_1 (Conv2D) (None, 27, 27, 6) 30 _________________________________________________________________activation_1 (Activation) (None, 27, 27, 6) 0 _________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 13, 13, 6) 0 _________________________________________________________________flatten_1 (Flatten) (None, 1014) 0 _________________________________________________________________dense_1 (Dense) (None, 10) 10150 _________________________________________________________________activation_2 (Activation) (None, 10) 0 =================================================================Total params: 10,180Trainable params: 10,180Non-trainable params: 0__________________________________________________________________

Training

Training a CNN works in the same way as a regular neural network, using backpropagration or gradient descent. However, here this is a bit more mathematically complex because of the convolution operations.

If you would like to read more about how regular neural nets work, you can read my previous article.

"""Before the training process, we have to put together a learning process in a particular form. It consists of 3 elements: an optimiser, a loss function and a metric."""
model.compile(loss='sparse_categorical_crossentropy', optimizer = 'adam', metrics=['acc'])
# dataset with handwritten digits to train the model onfrom keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = np.expand_dims(x_train,-1)
x_test = np.expand_dims(x_test,-1)
# Train the model, iterating on the data in batches of 32 samples# for 10 epochs
model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_test,y_test)
# Training...
Train on 60000 samples, validate on 10000 samplesEpoch 1/1060000/60000 [==============================] - 10s 175us/step - loss: 4.0330 - acc: 0.7424 - val_loss: 3.5352 - val_acc: 0.7746Epoch 2/1060000/60000 [==============================] - 10s 169us/step - loss: 3.5208 - acc: 0.7746 - val_loss: 3.4403 - val_acc: 0.7794Epoch 3/1060000/60000 [==============================] - 11s 176us/step - loss: 2.4443 - acc: 0.8372 - val_loss: 1.9846 - val_acc: 0.8645Epoch 4/1060000/60000 [==============================] - 10s 173us/step - loss: 1.8943 - acc: 0.8691 - val_loss: 1.8478 - val_acc: 0.8713Epoch 5/1060000/60000 [==============================] - 10s 174us/step - loss: 1.7726 - acc: 0.8735 - val_loss: 1.7595 - val_acc: 0.8718Epoch 6/1060000/60000 [==============================] - 10s 174us/step - loss: 1.6943 - acc: 0.8765 - val_loss: 1.7150 - val_acc: 0.8745Epoch 7/1060000/60000 [==============================] - 10s 173us/step - loss: 1.6765 - acc: 0.8777 - val_loss: 1.7268 - val_acc: 0.8688Epoch 8/1060000/60000 [==============================] - 10s 173us/step - loss: 1.6676 - acc: 0.8799 - val_loss: 1.7110 - val_acc: 0.8749Epoch 9/1060000/60000 [==============================] - 10s 172us/step - loss: 1.4759 - acc: 0.8888 - val_loss: 0.1346 - val_acc: 0.9597Epoch 10/1060000/60000 [==============================] - 11s 177us/step - loss: 0.1026 - acc: 0.9681 - val_loss: 0.1144 - val_acc: 0.9693

Summary

In summary, CNNs are especially useful for image classification and recognition. They have two main parts: a feature extraction part and a classification part.

The main special technique in CNNs is convolution, where a filter slides over the input and merges the input value + the filter value on the feature map. In the end, our goal is to feed new images to our CNN so it can give a probability for the object it thinks it sees or describe an image with text.

You can find the entire code here.

Περισσότερες συστάσεις σχετικά με τον εγκέφαλο ;

  • Διαβάστε αυτό το πολύ καλό άρθρο στον εγκέφαλο και πολλά άλλα.
  • Προτείνω επίσης αυτό το βιβλίο για τη νοημοσύνη και τον εγκέφαλο.
  • «Πώς να δημιουργήσετε ένα μυαλό» από τον Ray Kurzweil.