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

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

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

Το δείγμα συνόλου δεδομένων που θα χρησιμοποιήσετε

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

Η ετικέτα 1.0 αντιπροσωπεύει έναν σκύλο ενώ η ετικέτα 0.0 αντιπροσωπεύει μια γάτα.

instagram viewer

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

Εγκατάσταση και εισαγωγή του TensorFlow

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

Ανοιξε Google Colab. Αλλάξτε τον τύπο χρόνου εκτέλεσης σε GPU. Στη συνέχεια, εκτελέστε την ακόλουθη μαγική εντολή στο πρώτο κελί κώδικα για να εγκαταστήσετε το TensorFlow στο περιβάλλον σας.

!pip install tensorflow

Εισαγάγετε το TensorFlow και τις σχετικές ενότητες και κλάσεις του.

εισαγωγή tensorflow όπως και tf
από tensorflow.keras.προεπεξεργασία.εικόνα εισαγωγή ImageDataGenerator
από tensorflow.keras.μοντέλα εισαγωγή Ακολουθητικός
από tensorflow.keras.layers εισαγωγή Conv2D, MaxPooling2D, Flatten, Dense, Dropout

ο tensorflow.keras.προεπεξεργασία.εικόνα θα σας επιτρέψει να πραγματοποιήσετε αύξηση δεδομένων στο σύνολο δεδομένων σας.

Δημιουργία παρουσιών της κλάσης ImageDataGenerator

Δημιουργήστε ένα παράδειγμα του ImageDataGenerator κατηγορία για τα δεδομένα του τρένου. Θα χρησιμοποιήσετε αυτό το αντικείμενο για την προεπεξεργασία των δεδομένων εκπαίδευσης. Θα δημιουργήσει παρτίδες δεδομένων επαυξημένης εικόνας σε πραγματικό χρόνο κατά τη διάρκεια της εκπαίδευσης του μοντέλου.

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

# ορίστε τη γεννήτρια δεδομένων εικόνας για εκπαίδευση
train_datagen = ImageDataGenerator (rescale=1./255,
horizontal_flip=Αληθής,
width_shift_range=0.2,
ύψος_shift_range=0.2,
εύρος_φωτεινότητας=[0.2,1.0],
εύρος_ζουμ=0.2)

Δημιουργήστε ένα άλλο παράδειγμα του ImageDataGenerator τάξη για τα δεδομένα δοκιμής. Θα χρειαστείτε το επανακλιμάκωση παράμετρος. Θα ομαλοποιήσει τις τιμές των εικονοστοιχείων των εικόνων δοκιμής ώστε να ταιριάζουν με τη μορφή που χρησιμοποιείται κατά τη διάρκεια της προπόνησης.

# ορίστε τη γεννήτρια δεδομένων εικόνας για δοκιμή
test_datagen = ImageDataGenerator (rescale=1./255)

Δημιουργήστε μια τελική παρουσία του ImageDataGenerator κλάση για τα δεδομένα επικύρωσης. Εκ νέου κλιμάκωση των δεδομένων επικύρωσης με τον ίδιο τρόπο όπως τα δεδομένα δοκιμής.

# ορίστε τη γεννήτρια δεδομένων εικόνας για επικύρωση
validation_datagen = ImageDataGenerator (rescale=1./255)

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

Φόρτωση των δεδομένων σας

Δημιουργώ ένα DirectoryIterator αντικείμενο από τον κατάλογο εκπαίδευσης. Θα δημιουργήσει παρτίδες επαυξημένων εικόνων. Στη συνέχεια, καθορίστε τον κατάλογο που αποθηκεύει τα δεδομένα εκπαίδευσης. Αλλάξτε το μέγεθος των εικόνων σε σταθερό μέγεθος 64x64 εικονοστοιχεία. Καθορίστε τον αριθμό των εικόνων που θα χρησιμοποιεί κάθε παρτίδα. Τέλος, καθορίστε τον τύπο της ετικέτας που θα είναι δυάδικος (δηλαδή, γάτα ή σκύλος).

# ορίζοντας τον κατάλογο εκπαίδευσης
train_data = train_datagen.flow_from_directory (κατάλογος=r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
target_size=(64, 64),
batch_size=32,
class_mode='δυάδικος')

Δημιουργήστε ένα άλλο DirectoryIterator αντικείμενο από τον κατάλογο δοκιμών. Ρυθμίστε τις παραμέτρους στις ίδιες τιμές με αυτές των δεδομένων εκπαίδευσης.

# ορίζοντας τον κατάλογο δοκιμών
test_data = test_datagen.flow_from_directory (κατάλογος='/content/drive/MyDrive/cats_and_dogs_filtered/test',
target_size=(64, 64),
batch_size=32,
class_mode='δυάδικος')

Δημιουργήστε έναν τελικό DirectoryIterator αντικείμενο από τον κατάλογο επικύρωσης. Οι παράμετροι παραμένουν ίδιες με αυτές των δεδομένων εκπαίδευσης και δοκιμών.

# ορίζοντας τον κατάλογο επικύρωσης
validation_data = validation_datagen.flow_from_directory (κατάλογος='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
target_size=(64, 64),
batch_size=32,
class_mode='δυάδικος')

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

Καθορισμός του μοντέλου σας

Καθορίστε την αρχιτεκτονική του νευρωνικού σας δικτύου. Χρησιμοποίησε ένα Συνελικτικό Νευρωνικό Δίκτυο (CNN). Τα CNN έχουν σχεδιαστεί για να αναγνωρίζουν μοτίβα και χαρακτηριστικά σε εικόνες.

μοντέλο = Διαδοχική()

# συνελικτικό στρώμα με 32 φίλτρα μεγέθους 3x3
model.add (Conv2D(32, (3, 3), ενεργοποίηση="relu", input_shape=(64, 64, 3)))

# μέγιστο στρώμα συγκέντρωσης με μέγεθος πισίνας 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))

# συνελικτικό στρώμα με 64 φίλτρα μεγέθους 3x3
model.add (Conv2D(64, (3, 3), ενεργοποίηση="relu"))

# μέγιστο στρώμα συγκέντρωσης με μέγεθος πισίνας 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))

# ισοπεδώστε την έξοδο από τα στρώματα συνέλιξης και συγκέντρωσης
model.add (Flatten())

# πλήρως συνδεδεμένο επίπεδο με 128 μονάδες και ενεργοποίηση ReLU
model.add (Πυκνό(128, ενεργοποίηση="relu"))

# απορρίψτε τυχαία το 50% των μονάδων για να αποτρέψετε την υπερβολική τοποθέτηση
model.add (Dropout(0.5))

# στρώμα εξόδου με ενεργοποίηση σιγμοειδούς (δυαδική ταξινόμηση)
model.add (Πυκνό(1, ενεργοποίηση="σιγμοειδές"))

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

model.compile (απώλεια='binary_crossentropy', βελτιστοποιητής='Αδάμ', μετρήσεις=['ακρίβεια'])

Εκτυπώστε μια περίληψη της αρχιτεκτονικής του μοντέλου στην κονσόλα.

model.summary()

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

Αυτό σας δίνει μια επισκόπηση του πώς φαίνεται το σχέδιο του μοντέλου σας.

Εκπαίδευση του μοντέλου σας

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

# Εκπαιδεύστε το μοντέλο στα δεδομένα εκπαίδευσης
history = model.fit (train_data,
Steps_per_epoch=train_data.n // train_data.batch_size,
εποχές=50,
validation_data=validation_data,
validation_steps=validation_data.n // validation_data.batch_size)

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

Αξιολόγηση του μοντέλου σας

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

test_loss, test_acc = model.evaluate (test_data,
Steps=test_data.n // test_data.batch_size)
Τυπώνω(στ' Απώλεια δοκιμής: {test_loss}')
Τυπώνω(f'Ακρίβεια δοκιμής: {test_acc}')

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

Το μοντέλο αποδίδει αρκετά καλά σε δεδομένα που δεν έχουν δει ποτέ.

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

Πότε δεν είναι χρήσιμη η αύξηση δεδομένων;

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

Τι είναι ικανό το TensorFlow

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