Δημιουργία ενός αυτόματου κωδικοποιητή στο TensorFlow
September 30, 2022Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.
Εισαγωγή στους Autoencoders
Ένας αυτόματος κωδικοποιητής είναι ένα μοντέλο νευρωνικού δικτύου που μαθαίνει να κωδικοποιεί δεδομένα και να αναγεννά τα δεδομένα από τις κωδικοποιήσεις. Τα δεδομένα εισόδου έχουν συνήθως πολλές διαστάσεις και υπάρχει ανάγκη να πραγματοποιηθεί μείωση διαστάσεων και να διατηρηθούν μόνο οι απαραίτητες πληροφορίες. Ένας αυτόματος κωδικοποιητής περιλαμβάνει δύο μέρη – τον κωδικοποιητή και τον αποκωδικοποιητή. Όπως υποδηλώνει το όνομα, ο κωδικοποιητής εκτελεί κωδικοποίηση (μείωση διαστάσεων) και ο αποκωδικοποιητής προσπαθεί να αναπαράγει τα αρχικά δεδομένα εισόδου από τις κωδικοποιήσεις. Η μείωση διαστάσεων, η συμπίεση εικόνας, η απαλλαγή από θόρυβο εικόνας, η αναγέννηση εικόνας και η εξαγωγή χαρακτηριστικών είναι μερικές από τις εργασίες που μπορούν να χειριστούν οι αυτόματες κωδικοποιητές. Μια επέκταση του αυτόματου κωδικοποιητή γνωστή ως παραλλαγής αυτόματος κωδικοποιητής μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός νέου συνόλου δεδομένων εικόνας από ένα διαθέσιμο σύνολο εικόνων.
Θα μάθουμε την αρχιτεκτονική και τη λειτουργία ενός αυτόματου κωδικοποιητή δημιουργώντας και εκπαιδεύοντας έναν απλό αυτόματο κωδικοποιητή χρησιμοποιώντας το κλασικό σύνολο δεδομένων MNIST σε αυτό το άρθρο. Ας αρχίσουμε.
Επισκόπηση του συνόλου δεδομένων
Το κλασικό σύνολο δεδομένων MNIST περιέχει εικόνες χειρόγραφων ψηφίων. Αποτελείται από 60.000 εκπαίδευση και 10.000 δοκιμαστικές εικόνες στο σύνολο δεδομένων. Κάθε εικόνα στο σύνολο δεδομένων είναι τετράγωνη και έχει (28×28) 784 εικονοστοιχεία συνολικά. Το σύνολο δεδομένων MNIST είναι τόσο δημοφιλές που συνοδεύεται απευθείας με πολλά πακέτα python όπως το TensorFlow και το sklearn. Θα εισάγουμε απευθείας το σύνολο δεδομένων από το TensorFlow σε αυτό το έργο.
Εισαγωγή Ενοτήτων
Θα χρησιμοποιήσουμε το TensorFlow και το Keras για τη δημιουργία και την εκπαίδευση του αυτόματου κωδικοποιητή.
import tensorflow as tf from keras import backend as K import keras import numpy as np from tensorflow.keras import layers from tensorflow.keras.models import Sequential import matplotlib.pyplot as plt
Φόρτωση και προεπεξεργασία του συνόλου δεδομένων
Το σύνολο δεδομένων MNIST μπορεί να προσπελαστεί και να φορτωθεί απευθείας από το TensorFlow. Ουσιαστικά, οι ετικέτες κλάσης για τις εικόνες δεν χρησιμοποιούνται για την εκπαίδευση του αυτόματου κωδικοποιητή και θα μπορούσαν να απορριφθούν με ασφάλεια, αλλά θα τις χρησιμοποιήσω για την επισήμανση των γραφικών για καλύτερη κατανόηση. Θα κανονικοποιήσουμε τις εικόνες για να μειώσουμε την υπολογιστική πολυπλοκότητα της εκπαίδευσης του αυτόματου κωδικοποιητή. ο 1 που υπάρχει στην έξοδο μετά την αλλαγή σχήματος αναφέρεται στον αριθμό των καναλιών που υπάρχουν στην εικόνα. Καθώς έχουμε να κάνουμε με εικόνες σε κλίμακα του γκρι, ο αριθμός των καναλιών θα είναι 1.
# loading mnist dataset (x_train, y_train), (x_test, y_test) = keras.<a onclick="parent.postMessage({'referent':'.keras.datasets'}, '*')">datasets.mnist.load_data() # normalising and reshaping the data x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. x_train = np.<a onclick="parent.postMessage({'referent':'.numpy.reshape'}, '*')">reshape(x_train, (x_train.shape[0], 28, 28, 1)) x_test = np.<a onclick="parent.postMessage({'referent':'.numpy.reshape'}, '*')">reshape(x_test, (x_test.shape[0], 28, 28, 1)) x_train.shape, x_test.shape
((60000, 28, 28, 1), (10000, 28, 28, 1))
Δημιουργία του αυτόματου κωδικοποιητή
Όπως αναφέρθηκε προηγουμένως, ο αυτόματος κωδικοποιητής αποτελείται από δύο μέρη – τον κωδικοποιητή και τον αποκωδικοποιητή. Η αρχιτεκτονική του κωδικοποιητή και του αποκωδικοποιητή είναι κατοπτρικές εικόνες ο ένας του άλλου. Για παράδειγμα, ο κωδικοποιητής έχει επίπεδα max-pooling για μείωση της διάστασης των χαρακτηριστικών, ενώ ο αποκωδικοποιητής έχει επίπεδα upsampling που αυξάνουν τον αριθμό των χαρακτηριστικών. Θα δημιουργήσουμε και θα εκπαιδεύσουμε τον αυτόματο κωδικοποιητή και αργότερα θα εξαγάγουμε τον κωδικοποιητή και τον αποκωδικοποιητή από τα επίπεδα του εκπαιδευμένου αυτόματου κωδικοποιητή. Θα χρησιμοποιήσουμε το λειτουργικό API για τη δημιουργία του αυτόματου κωδικοποιητή. Το λειτουργικό API παρέχει καλύτερο έλεγχο στον χρήστη για τη δημιουργία του αυτόματου κωδικοποιητή. Το τμήμα κωδικοποιητή του αυτόματου κωδικοποιητή θα έχει τρία επίπεδα Convolution – Rectified Linear Unit – MaxPooling. Η είσοδος για τον κωδικοποιητή θα είναι η εικόνα σε κλίμακα του γκρι 28×28 και η έξοδος θα είναι η κωδικοποίηση χαρακτηριστικών 4x4x8 (ή 128). Ο κωδικοποιητής θα μειώσει τον αριθμό των χαρακτηριστικών από 784 σε 128. Έτσι, ουσιαστικά κάθε εικόνα που αποτελείται από 784 χαρακτηριστικά θα αναπαρασταθεί αποτελεσματικά χρησιμοποιώντας μόνο 128 χαρακτηριστικά. Ο κωδικοποιητής μπορεί να χρησιμοποιηθεί ξεχωριστά ως μειωτήρας διαστάσεων που αντικαθιστά μεθόδους όπως PCA, BFE και FFS για εξαγωγή μόνο των σημαντικών χαρακτηριστικών. Όπως αναφέρθηκε προηγουμένως, η αρχιτεκτονική του αποκωδικοποιητή θα είναι η κατοπτρική εικόνα της αρχιτεκτονικής του κωδικοποιητή. Έτσι, το τμήμα του αποκωδικοποιητή θα έχει τρία επίπεδα Convolution – Rectified Linear Unit – Upsampling. Καθώς τα στρώματα συγκέντρωσης εκτελούν μείωση διαστάσεων στον κωδικοποιητή, τα επίπεδα δειγματοληψίας θα αυξήσει τον αριθμό των χαρακτηριστικών και ως εκ τούτου χρησιμοποιούνται στον αποκωδικοποιητή. Το επίπεδο upsampling δεν παρεμβάλλει νέα δεδομένα αλλά απλώς επαναλαμβάνει τις γραμμές και τις στήλες αυξάνοντας έτσι τη διάσταση για τη διαδικασία αναγέννησης. Μπορείτε να μάθετε περισσότερα σχετικά με το επίπεδο upsampling που χρησιμοποιείται σε αυτό το άρθρο εδώ. Ο αποκωδικοποιητής θα προσπαθήσει να αναπαράγει την εικόνα εισόδου από την κωδικοποίηση 128 δυνατοτήτων. Η είσοδος για τον αποκωδικοποιητή θα είναι οι κωδικοποιήσεις χαρακτηριστικών 4x4x8 (ή 128) που παράγονται από τον κωδικοποιητή και η έξοδος του αποκωδικοποιητή θα είναι η εικόνα σε κλίμακα του γκρι 28×28. Η διαφορά μεταξύ της αναδημιουργημένης εικόνας από τον αποκωδικοποιητή και της αρχικής εικόνας εισόδου θα είναι η απώλεια που θα διαδοθεί πίσω για να εκπαιδεύσει τον αυτόματο κωδικοποιητή.
input_img = keras.<a onclick="parent.postMessage({'referent':'.keras.Input'}, '*')">Input(shape=(28, 28, 1)) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.Conv2D'}, '*')">Conv2D(32, (3, 3), activation='relu', padding='same')(input_img) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.MaxPooling2D'}, '*')">MaxPooling2D((2, 2), padding='same')(x) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.Conv2D'}, '*')">Conv2D(16, (3, 3), activation='relu', padding='same')(x) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.MaxPooling2D'}, '*')">MaxPooling2D((2, 2), padding='same')(x) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.Conv2D'}, '*')">Conv2D(8, (3, 3), activation='relu', padding='same')(x) encoded = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.MaxPooling2D'}, '*')">MaxPooling2D((2, 2), padding='same')(x) # the shape is 4,4,8 here x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.Conv2D'}, '*')">Conv2D(8, (3, 3), activation='relu', padding='same')(encoded) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.UpSampling2D'}, '*')">UpSampling2D((2, 2))(x) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.Conv2D'}, '*')">Conv2D(16, (3, 3), activation='relu', padding='same')(x) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.UpSampling2D'}, '*')">UpSampling2D((2, 2))(x) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.Conv2D'}, '*')">Conv2D(32, (3, 3), activation='relu')(x) x = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.UpSampling2D'}, '*')">UpSampling2D((2, 2))(x) decoded = layers.<a onclick="parent.postMessage({'referent':'.tensorflow.keras.layers.Conv2D'}, '*')">Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x) autoencoder = keras.<a onclick="parent.postMessage({'referent':'.keras.Model'}, '*')">Model(input_img, decoded) autoencoder.compile(optimizer="adam", loss="binary_crossentropy") autoencoder.summary()
Αυτή είναι η συνολική αρχιτεκτονική του αυτόματου κωδικοποιητή.

Αρχιτεκτονική του αυτόματου κωδικοποιητή
Εκπαίδευση του αυτόματου κωδικοποιητή
Όπως αναφέρθηκε προηγουμένως, τόσο η είσοδος όσο και η έξοδος θα είναι ίδιες για τους αυτόματους κωδικοποιητές. Έτσι, οι εικόνες θα είναι η είσοδος και η έξοδος για την εκπαίδευση του αυτόματου κωδικοποιητή.
autoencoder.fit(x_train, x_train, epochs=100, batch_size=128, validation_data=(x_test, x_test))
Epoch 1/100 469/469 [==============================] - 33s 67ms/step - loss: 0.1892 - val_loss: 0.1296 Epoch 2/100 469/469 [==============================] - 30s 65ms/step - loss: 0.1214 - val_loss: 0.1136 Epoch 3/100 469/469 [==============================] - 30s 63ms/step - loss: 0.1112 - val_loss: 0.1070 ... ... Epoch 99/100 469/469 [==============================] - 30s 64ms/step - loss: 0.0808 - val_loss: 0.0798 Epoch 100/100 469/469 [==============================] - 31s 65ms/step - loss: 0.0808 - val_loss: 0.0798
Εξαγωγή κωδικοποιητή και αποκωδικοποιητή
Τα πρώτα 7 επίπεδα αντιπροσωπεύουν τον κωδικοποιητή ενώ τα υπόλοιπα επίπεδα αντιπροσωπεύουν τον αποκωδικοποιητή. Μπορούμε να εξαγάγουμε τα αντίστοιχα επίπεδα από τον εκπαιδευμένο αυτόματο κωδικοποιητή και να δημιουργήσουμε τον κωδικοποιητή και τον αποκωδικοποιητή.
encoder = Sequential() decoder = Sequential() for layer in autoencoder.layers[:8]: encoder.add(layer) for layer in autoencoder.layers[8:]: decoder.add(layer)
Δοκιμή του αυτόματου κωδικοποιητή
Αυτά είναι τα πρώτα δέκα δείγματα από το σετ προπόνησης.
plt.figure(figsize=(10,5)) n = 10 for i in range(n): plt.subplot(2,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(x_train[i], cmap='gray') plt.xlabel(y_train[i]) plt.show()

δείγματα εικόνων εισόδου
Για να κατανοήσουμε πώς λειτουργούν ο κωδικοποιητής και ο αποκωδικοποιητής, θα τα χρησιμοποιήσουμε ξεχωριστά για να κωδικοποιήσουμε και στη συνέχεια να αποκωδικοποιήσουμε τα δείγματα. Αρχικά θα κωδικοποιήσουμε τα δείγματα εικόνων εισόδου σε κωδικοποιήσεις 128 χαρακτηριστικών χρησιμοποιώντας τον κωδικοποιητή. Στη συνέχεια, θα χρησιμοποιήσουμε τον αποκωδικοποιητή για να αναδημιουργήσουμε τις εικόνες εισόδου από τις κωδικοποιήσεις 128 χαρακτηριστικών που δημιουργούνται από τον κωδικοποιητή.
encoded_sample = encoder.predict(x_train[0:10]) # encoding encoded_sample.shape
(10, 4, 4, 8)
decoded_sample = decoder.predict(encoded_sample) # decoding decoded_sample.shape
(10, 28, 28, 1)
Αυτές είναι οι εικόνες που δημιουργούνται από τον αποκωδικοποιητή χρησιμοποιώντας τις κωδικοποιήσεις 128 χαρακτηριστικών από τον κωδικοποιητή.
plt.figure(figsize=(10,5)) n = 10 for i in range(n): plt.subplot(2,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(decoded_sample[i], cmap='gray') plt.xlabel(y_train[i]) plt.show()

εικόνες που δημιουργούνται από αποκωδικοποιητή
Μπορούμε να δούμε ότι ο αυτόματος κωδικοποιητής είναι σε θέση να αναπαράγει εικόνες με ακρίβεια. Τώρα, ας προσπαθήσουμε να δημιουργήσουμε ένα νέο σύνολο εικόνων. Ουσιαστικά, για το σκοπό αυτό πρέπει να χρησιμοποιούνται αυτοκωδικοποιητές παραλλαγών. Οι αυτόματες κωδικοποιητές μπορούν να χρησιμοποιηθούν για τη δημιουργία νέων εικόνων, αλλά το μειονέκτημα είναι ότι μπορεί να παράγουν πολύ θόρυβο εάν οι κωδικοποιήσεις είναι πολύ διαφορετικές και δεν επικαλύπτονται.
Για να δημιουργήσουμε ένα νέο σύνολο εικόνων, πρέπει να παρεμβάλουμε νέες κωδικοποιήσεις και να τις χρησιμοποιήσουμε για να δημιουργήσουμε νέες εικόνες χρησιμοποιώντας τον αποκωδικοποιητή. Θα χρησιμοποιήσουμε τις δύο πρώτες εικόνες που εμφανίζονται στα δείγματα εικόνων εισαγωγής και θα δούμε πώς το ψηφίο 5 μπορεί να αλλάξει σε ψηφίο 0.
starting, ending = encoder.predict(x_train[0:2]) # interpolating new encodings values = np.linspace(starting, ending, 10) generated_images = decoder.predict(values) # generate new images plt.figure(figsize=(10,5)) n = 10 for i in range(n): plt.subplot(2,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(generated_images[i], cmap='gray') plt.show()

Μπορούμε να δούμε πώς δημιουργείται ένα νέο σύνολο εικόνων από τις κωδικοποιήσεις που παρεμβάλαμε.
συμπέρασμα
Σε αυτό το άρθρο, συζητήσαμε τα ακόλουθα.
- Αυτόματοι κωδικοποιητές
- Δεδομένα MNIST
- Δημιουργία ενός αυτόματου κωδικοποιητή
- Εκπαίδευση στον αυτόματο κωδικοποιητή
- Εξαγωγή του κωδικοποιητή και του αποκωδικοποιητή από έναν εκπαιδευμένο αυτόματο κωδικοποιητή
- Κωδικοποίηση εικόνων με χρήση του κωδικοποιητή
- Αναγέννηση εικόνων από κωδικοποιήσεις χρησιμοποιώντας τον αποκωδικοποιητή
- Δημιουργία νέων εικόνων με παρεμβολή νέων κωδικοποιήσεων
Για τη δημιουργία νέων εικόνων με παρεμβολή νέων κωδικοποιήσεων, μπορούμε να χρησιμοποιήσουμε μεταβλητούς αυτόματους κωδικοποιητές. Οι αυτοκωδικοποιητές μεταβλητών χρησιμοποιούν το KL-απόκλιση λειτουργία απώλειας που διασφαλίζει ότι οι κωδικοποιήσεις επικαλύπτονται και επομένως η διαδικασία δημιουργίας νέων εικόνων είναι πολύ πιο ομαλή, χωρίς θόρυβο και καλύτερης ποιότητας. Αυτός είναι ο λόγος για τον οποίο οι αυτόματες κωδικοποιητές παραλλαγών αποδίδουν καλύτερα από τους αυτοκωδικοποιητές βανίλιας για τη δημιουργία νέων εικόνων. Θα προσπαθήσω να καλύψω τους αυτοκωδικοποιητές παραλλαγών σε άλλο άρθρο. Αυτό είναι για αυτό το άρθρο.
Ευχαριστώ για την ανάγνωση και καλή μάθηση!
Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα.