Οδηγός Dummies για τη σύνταξη μιας προσαρμοσμένης συνάρτησης απώλειας στο Tensorflow
September 29, 2022Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.
Εισαγωγή
Έχετε συναντήσει ποτέ μια κατάσταση όπου αισθανθήκατε ότι χρησιμοποιείτε μια προσαρμοσμένη λειτουργία απώλειας στο μοντέλο μηχανικής εκμάθησης; Ίσως, έπρεπε να πειραματιστείτε με μια νέα λειτουργία απώλειας ενώ γράφετε μια ερευνητική εργασία ή να χειριστείτε μια νέα επιχειρηματική υπόθεση. Η σύνταξη μιας προσαρμοσμένης συνάρτησης απώλειας για τα μοντέλα μηχανικής εκμάθησης δεν είναι πολύ δύσκολη. Αυτό το άρθρο θα μας διδάξει πώς να γράψουμε μια προσαρμοσμένη συνάρτηση απώλειας Tensorflow. Θα γράψουμε τον προσαρμοσμένο κώδικα για να εφαρμόσουμε την κατηγορική απώλεια διασταυρούμενης εντροπίας. Στη συνέχεια θα συγκρίνουμε το αποτέλεσμά του με την ενσωματωμένη κατηγορική απώλεια διασταυρούμενης εντροπίας της βιβλιοθήκης Tensorflow.
Μέσω της μηχανικής μάθησης, προσπαθούμε να μιμούμε την ανθρώπινη διαδικασία μάθησης σε μια μηχανή. Όπως εμείς, έτσι και οι μηχανές μαθαίνουν από λάθη του παρελθόντος. Μια συνάρτηση απώλειας χρησιμοποιείται για την αξιολόγηση της ποιότητας εκμάθησης του μηχανήματος. Δείχνει πόσο καλά το μοντέλο μηχανικής εκμάθησης μπορεί να προβλέψει το αποτέλεσμα από ένα δεδομένο σύνολο χαρακτηριστικών. Η κατασκευή οποιουδήποτε μοντέλου μηχανικής μάθησης σκοπεύει να προβλέψει την πιθανολογική τιμή στόχου όσο το δυνατόν ακριβέστερα. Έτσι, η συνάρτηση απώλειας μπορεί να μετρήσει πόσο απέχει η προβλεπόμενη τιμή από την πραγματική τιμή. Η συνάρτηση απώλειας δεν διορθώνεται και αλλάζει με βάση την εργασία. Ο στόχος μιας διαδικασίας βελτιστοποίησης είναι να ελαχιστοποιήσει τη συνάρτηση απώλειας.
Λειτουργίες απώλειας στο Tensorflow
Το Tensorflow είναι μια ευρέως χρησιμοποιούμενη πλατφόρμα μηχανικής εκμάθησης που βασίζεται σε Python. Η βιβλιοθήκη Tensorflow μπορεί να χρησιμοποιηθεί για την ανάπτυξη μοντέλων μηχανικής εκμάθησης σε όλες τις εργασίες. Αλλά αυτή η βιβλιοθήκη έχει μια συγκεκριμένη εστίαση στην αποτελεσματική ανάπτυξη μοντέλων βαθιάς μάθησης. Το Tensorflow παρέχει πολλές ενσωματωμένες και βελτιστοποιημένες λειτουργίες απώλειας για την ανάπτυξη μοντέλων μηχανικής εκμάθησης. Μερικές συνήθως χρησιμοποιούμενες συναρτήσεις απώλειας σε εργασίες παλινδρόμησης είναι Μέσο τετράγωνο σφάλμα (MSE), Μέσο απόλυτο σφάλμα (MAE), Μέσο απόλυτο ποσοστό σφάλματος (MAPE)Huber Loss κ.λπ. Συνήθεις συναρτήσεις απώλειας στις εργασίες ταξινόμησης είναι η δυαδική διασταυρούμενη εντροπία, η κατηγορική διασταυρούμενη εντροπία κ.λπ.
Κατηγορική Διασταυρούμενη εντροπία
Χρησιμοποιούμε κατηγορική απώλεια διασταυρούμενης εντροπίας όταν χρειάζεται να προβλέψουμε δύο ή περισσότερες κατηγορίες στόχων (ταξινόμηση πολλαπλών κλάσεων). Εδώ το μοντέλο εκπαιδεύεται να προβλέπει μια τάξη από πολλές τάξεις. Εάν θεωρήσουμε ότι η πραγματική τιμή στόχος είναι y, η προβλεπόμενη τιμή είναι και υπάρχει αριθμός C κλάσεων, τότε η απώλεια Κατηγορικής Διασταυρούμενης Εντροπίας (CE) μπορεί να οριστεί ως:
Συνήθως, μια συνάρτηση ενεργοποίησης (Sigmoid/Softmax) εφαρμόζεται στις βαθμολογίες πριν υπολογιστεί η απώλεια διασταυρούμενης εντροπίας. Η Κατηγορική απώλεια διασταυρούμενης εντροπίας είναι μια γενικευμένη εκδοχή της απώλειας δυαδικής διασταυρούμενης εντροπίας. Στην απώλεια δυαδικής διασταυρούμενης εντροπίας, C = 2 αφού υπάρχουν μόνο δύο κλάσεις. Άρα η απώλεια γίνεται:
Δεδομένου ότι υπάρχουν μόνο δύο πιθανές κατηγορίες, και
.
Προσαρμοσμένη συνάρτηση απώλειας στο Tensorflow
Θα γράψουμε την κατηγορική συνάρτηση απώλειας διασταυρούμενης εντροπίας χρησιμοποιώντας τον προσαρμοσμένο μας κώδικα στο Tensorflow με το Keras API. Στη συνέχεια, θα συγκρίνουμε το αποτέλεσμα μεταξύ αυτής της προσαρμοσμένης κατηγορικής συνάρτησης διασταυρούμενης εντροπίας και της ενσωματωμένης κατηγορικής συνάρτησης διασταυρούμενης εντροπίας του Tensorflow.
Μόλις εκπαιδευτεί, κάθε μοντέλο παράγει μια προβλεπόμενη τιμή της μεταβλητής στόχου. Για μια συνάρτηση απώλειας, χρειαζόμαστε την πραγματική τιμή του μοντέλου και την προβλεπόμενη τιμή για να συγκρίνουμε και να υπολογίσουμε την τιμή απώλειας. Στο Tensorflow, θα γράψουμε μια προσαρμοσμένη συνάρτηση απώλειας που θα λάβει την πραγματική τιμή και την προβλεπόμενη τιμή ως είσοδο. Αυτή η προσαρμοσμένη συνάρτηση απώλειας θα υποκατηγορήσει τη βασική κλάση „απώλεια“ του Keras. Για καλύτερη απόδοση, πρέπει να γράψουμε τη διανυσματική υλοποίηση της συνάρτησης. Θα χρησιμοποιήσουμε επίσης βασικές συναρτήσεις Tensorflow για να επωφεληθούμε από τη δυνατότητα γραφήματος του Tensorflow.
class Custom_CE_Loss(tf.keras.losses.Loss): def __init__(self): super().__init__() def call(self, y_true, y_pred): log_y_pred = tf.math.log(y_pred) elements = -tf.math.multiply_no_nan(x=log_y_pred, y=y_true) return tf.reduce_mean(tf.reduce_sum(elements,axis=1))
Εδώ, μπορούμε να δούμε ότι η συνάρτηση Custom_CE_Loss υποκατηγορείται από τη βασική κλάση „Loss“. Παρακάμπτουμε τη μέθοδο κλήσης που λαμβάνει την πραγματική τιμή και την προβλεπόμενη τιμή ως είσοδο. Χρησιμοποιούμε επίσης τις ενσωματωμένες μαθηματικές συναρτήσεις του Tensorflow για τον υπολογισμό του ημερολογίου, του πολλαπλασιασμού, του αθροίσματος, του μέσου όρου κ.λπ.
ο multiply_no_nan Η συνάρτηση υπολογίζει το γινόμενο των x και y και επιστρέφει 0 εάν το y είναι μηδέν, ακόμα κι αν το x είναι NaN ή άπειρο. ο μείωση_αθροίσματος Η συνάρτηση υπολογίζει το άθροισμα των στοιχείων στις διαστάσεις ενός τανυστή. ο μείωση_μέσου Η συνάρτηση μειώνει το input_tensor υπολογίζοντας τον μέσο όρο των στοιχείων στις διαστάσεις που δίνονται στον άξονα.
Σύγκριση της συνάρτησης προσαρμοσμένης απώλειας
Ας υποθέσουμε ότι σε ένα πρόβλημα ταξινόμησης πολλαπλών τάξεων, υπάρχουν πέντε ετικέτες κλάσεων. Υπάρχουν δύο σημεία δεδομένων όπου οι κλάσεις-στόχοι είναι 4 και 1. Πρέπει πρώτα να μετατρέψουμε αυτό το διάνυσμα κλάσης (ακέραιοι) σε έναν πίνακα δυαδικής κλάσης χρησιμοποιώντας το to_categorical λειτουργία. Οι προβλεπόμενες τιμές βρίσκονται σε ένα διάνυσμα που ονομάζεται y_pred, το οποίο είναι η έξοδος softmax ενός ταξινομητή.
y_true = tf.constant(tf.keras.utils.to_categorical([4, 1])) y_pred = tf.constant([[0 , .7 , 0 ,0 , .3], [0 , .6 , .3 ,0 , .1]])
Θα εκτελέσουμε τη συνάρτηση Custom_CE_Loss που αναφέρεται παραπάνω και τη συνάρτηση TensorFlow Κατηγορική Σταυροτροπία λειτουργία απώλειας και συγκρίνετε τα αποτελέσματα.
print('Tensorflow CE : ',tf.keras.losses.CategoricalCrossentropy()(y_true, y_pred).numpy()) print('My CE : ', Custom_CE_Loss ()(y_true, y_pred).numpy())
Και τα δύο αποτελέσματα πρέπει να έρθουν ως 0,8573992.
Ας εφαρμόσουμε αυτήν την προσαρμοσμένη συνάρτηση απώλειας σε ένα νευρωνικό δίκτυο για ένα πρόβλημα ταξινόμησης εικόνων πολλαπλών κλάσεων. Θα χρησιμοποιήσουμε το προεκπαιδευμένο μοντέλο VGG16 του Tensorflow για να ταξινομήσουμε τις εικόνες CIFAR-10. Το σύνολο δεδομένων CIFAR-10 αποτελείται από 60000 έγχρωμες εικόνες 32×32 σε 10 κατηγορίες, με 6000 εικόνες ανά τάξη. Υπάρχουν 50000 εικόνες εκπαίδευσης και 10000 εικόνες δοκιμής.
import tensorflow as tf from tensorflow.keras import datasets from keras.layers import Dense, Dropout, Flatten from keras.models import Model (train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data() #Normalize the pixel values train_images, test_images = train_images / 255.0, test_images / 255.0
Οι κλάσεις προορισμού είναι αριθμητικές τιμές της ετικέτας κλάσης. Πρέπει να κωδικοποιήσουμε one-hot και να τα κάνουμε να επιπλέουν.
train_labels = tf.keras.utils.to_categorical(train_labels) test_labels = tf.keras.utils.to_categorical(test_labels) train_labels = tf.convert_to_tensor(train_labels, dtype=tf.float32) test_labels = tf.convert_to_tensor(test_labels, dtype=tf.float32)
Ας φορτώσουμε το προεκπαιδευμένο μοντέλο VGG16 του Tensorflow. Δεν θα συμπεριλάβουμε τα ανώτερα στρώματα (πλήρης σύνδεση στρώματα) αφού θα τα εκπαιδεύσουμε για αυτήν την εργασία (ταξινόμηση CIFAR-10). Τα στρώματα συνέλιξης και συγκέντρωσης διατηρούνται όλα προεκπαιδευμένα και αυτό ονομάζεται μάθηση μεταφοράς.
base_model = tf.keras.applications.vgg16.VGG16(input_shape = (32, 32, 3), include_top = False, weights="imagenet") base_model.trainable=False model=base_model.output model=Flatten()(model) model=Dense(4096, activation='relu')(model) model=Dropout(rate=0.5)(model) model=Dense(4096, activation='relu')(model) model=Dropout(rate=0.5)(model) model=Dense(10, activation='softmax')(model) model=Model(inputs=base_model.inputs, outputs=model) model.summary()
Ας συντάξουμε το μοντέλο με αυτήν την προσαρμοσμένη απώλεια διασταυρούμενης εντροπίας λαμβάνοντας την „ακρίβεια“ ως μέτρηση. Θα εκτελέσουμε την εκπαίδευση για 10 εποχές και θα αξιολογήσουμε το μοντέλο στο σύνολο δεδομένων δοκιμής.
model.compile(optimizer="adam", loss=Custom_CE_Loss(), metrics=['accuracy']) history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
συμπέρασμα
Αυτό το άρθρο μας έμαθε για τις συναρτήσεις απώλειας γενικά, τις κοινές συναρτήσεις απώλειας και τον τρόπο ορισμού μιας συνάρτησης απώλειας χρησιμοποιώντας το Keras API του Tensorflow. Γράψαμε
- Μάθαμε τι είναι η κατηγορική απώλεια διασταυρούμενης εντροπίας, πώς λειτουργεί και πώς γενικεύει την δυαδική διασταυρούμενη εντροπία απώλεια.
- Μάθαμε να γράφουμε μια κατηγορική απώλεια διασταυρούμενης εντροπίας συνάρτηση στο Tensorflow χρησιμοποιώντας τη συνάρτηση απώλειας βάσης του Keras.
- Εμείς σύγκρινε το αποτέλεσμα με την ενσωματωμένη λειτουργία απώλειας διασταυρούμενης εντροπίας του Tensorflow.
- Υλοποιήσαμε την προσαρμοσμένη συνάρτηση απώλειας για α πολυκλασική ταξινόμηση εικόνων πρόβλημα με τη χρήση ενός προεκπαιδευμένου μοντέλου VGG16.
Όπως η απώλεια διασταυρούμενης εντροπίας που αναδημιουργήθηκε παραπάνω, οποιαδήποτε άλλη συνάρτηση απώλειας μπορεί επίσης να γραφτεί εύκολα στο Tensorflow.
Ευχαριστώ για την ανάγνωση! Παρακαλώ ενημερώστε με στην ενότητα σχολίων εάν έχετε οποιεσδήποτε ερωτήσεις.
βιβλιογραφικές αναφορές
- Λειτουργίες απώλειας Tensorflow: https://www.tensorflow.org/api_docs/python/tf/keras/losses
- Κατηγορική απώλεια διασταυρούμενης εντροπίας Tensorflow: https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalCrossentropy
Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα.