Ανάλυση Τιμών Polkadot 13 Σεπ

Συνελικτικό νευρωνικό δίκτυο – υλοποίηση PyTorch στο σύνολο δεδομένων CIFAR-10

Κόμβος πηγής: 1866263

Αυτό το άρθρο δημοσιεύθηκε ως μέρος του Επιστήμη δεδομένων Blogathon

Εισαγωγή

Cifar 10 | Σύμπλεγμα νευρωνικών δικτύων pytorch
                                    1 εικόνα

Τα νευρωνικά δίκτυα, που ονομάζονται επίσης ConvNets, παρουσιάστηκαν για πρώτη φορά τη δεκαετία του 1980 από τον Yann LeCun, ερευνητή της επιστήμης των υπολογιστών που εργάστηκε στο παρασκήνιο. Το LeCun βασίστηκε στο έργο του Kunihiko Fukushima, Ιάπωνα επιστήμονα, ένα βασικό δίκτυο για την αναγνώριση εικόνας.

Η παλιά έκδοση του CNN, που ονομάζεται LeNet (μετά το LeCun), μπορεί να δει χειρόγραφα ψηφία. Το CNN βοηθά στην εύρεση κωδικών PIN από το ταχυδρομείο. Παρά την εξειδίκευσή τους, το ConvNets παρέμεινε κοντά στην όραση του υπολογιστή και στην τεχνητή νοημοσύνη επειδή αντιμετώπισαν ένα μεγάλο πρόβλημα: Δεν μπορούσαν να κλιμακώσουν πολύ. Το CNN απαιτεί πολλά δεδομένα και ενσωματώνει πόρους για να λειτουργήσει καλά για μεγάλες εικόνες.

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

Σύμπλεγμα νευρωνικών δικτύων pytorch
2 εικόνα

Η παραπάνω εικόνα μας δείχνει ένα μοντέλο CNN που λαμβάνει μια εικόνα που μοιάζει με ψηφίο 2 και μας δίνει το αποτέλεσμα του τι ψηφίου εμφανίστηκε στην εικόνα ως αριθμός. Θα συζητήσουμε λεπτομερώς πώς θα το καταφέρουμε σε αυτό το άρθρο.

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

Εισαγωγή της βιβλιοθήκης PyTorch 

εισαγωγή numpy ως np εισαγωγή pandas ως pd
εισαγωγή πυρσού

Σε αυτό το βήμα, εισάγουμε τις απαιτούμενες βιβλιοθήκες. Μπορούμε να δούμε ότι χρησιμοποιούμε το NumPy για αριθμητικές λειτουργίες και pandas για λειτουργίες πλαισίου δεδομένων. Η βιβλιοθήκη πυρσού χρησιμοποιείται για την εισαγωγή του Pytorch.

Το Pytorch έχει ένα στοιχείο nn που χρησιμοποιείται για την αφαίρεση λειτουργιών και λειτουργιών μηχανικής μάθησης. Αυτό εισάγεται ως F. Η βιβλιοθήκη torchvision χρησιμοποιείται έτσι ώστε να μπορούμε να εισαγάγουμε το σύνολο δεδομένων CIFAR-10. Αυτή η βιβλιοθήκη έχει πολλά σύνολα δεδομένων εικόνων και χρησιμοποιείται ευρέως για έρευνα. Οι μετασχηματισμοί μπορούν να εισαχθούν έτσι ώστε να μπορούμε να αλλάξουμε το μέγεθος της εικόνας στο ίδιο μέγεθος για όλες τις εικόνες. Το tqdm χρησιμοποιείται έτσι ώστε να μπορούμε να παρακολουθούμε την πρόοδο κατά τη διάρκεια της εκπαίδευσης και χρησιμοποιείται για οπτικοποίηση.

Διαβάστε το απαιτούμενο σύνολο δεδομένων

trainData = pd.read_csv ('cifar-10/trainLabels.csv') trainData.head ()

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

Ανάλυση των δεδομένων με το PyTorch

print ("Number of points:", trainData.shape [0]) print ("Number of features:", trainData.shape [1]) print ("Features:", trainData.columns.values) print ("Number of Μοναδικές τιμές ") για col σε trainData: print (col,": ", len (trainData [col] .unique ())) plt.figure (figsize = (12,8))

Παραγωγή:

Αριθμός πόντων: 50000 Αριθμός χαρακτηριστικών: 2 Χαρακτηριστικά: ['id' 'label'] Αριθμός μοναδικών τιμών id: 50000 label: 10

Σε αυτό το βήμα, αναλύουμε το σύνολο δεδομένων και βλέπουμε ότι τα δεδομένα τρένου μας έχουν περίπου 50000 σειρές με το αναγνωριστικό τους και τη σχετική ετικέτα. Υπάρχουν συνολικά 10 κατηγορίες όπως στο όνομα CIFAR-10.

Λήψη του συνόλου επικύρωσης χρησιμοποιώντας το PyTorch

από torch.utils.data import random_split val_size = 5000 train_size = len (dataset) - val_size train_ds, val_ds = random_split (dataset, [train_size, val_size]) len (train_ds), len (val_ds)

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

(45000, 5000)
από torch.utils.data.dataloader import DataLoader batch_size = 64 train_dl = DataLoader (train_ds, batch_size, shuffle = True, num_workers = 4, pin_memory = True) val_dl = DataLoader (val_ds, batch_size, pin_mem = 4) True_workers =

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

Καθορισμός των απαιτούμενων συναρτήσεων

@torch.no_grad () def ακρίβεια (έξοδοι, ετικέτες): _, preds = torch.max (έξοδοι, dim = 1) επιστροφή torch.tensor (torch.sum (preds == ετικέτες) .item () / len (preds )) κλάση ImageClassificationBase (nn. Module): def training_step (self, batch): εικόνες, ετικέτες = batch out = self (εικόνες) # Δημιουργία προβλέψεων απώλειας = F.cross_entropy (έξω, ετικέτες) # Υπολογίστε απώλεια accu = ακρίβεια (έξω , ετικέτες) απώλεια επιστροφής, accu def validation_step (self, batch): εικόνες, ετικέτες = batch out = self (εικόνες) # Δημιουργία προβλέψεων απώλεια = F.cross_entropy (έξω, ετικέτες) # Υπολογισμός απώλειας acc = ακρίβεια (έξω, ετικέτες) # Υπολογισμός επιστροφής ακρίβειας {'Απώλεια': loss.detach (), 'Ακρίβεια': acc} def validation_epoch_end (self, outputs): batch_losses = [x ['Loss'] for x in outputs] epoch_loss = torch.stack (batch_losses ) .mean () # Συνδυάστε ζημίες batch_accs = [x ['Ακρίβεια'] για x σε εξόδους] epoch_acc = torch.stack (batch_accs) .mean () # Συνδυάστε τις ακρίβειες επιστροφής {'Απώλεια': epoch_loss.item (), ' Ακρίβεια ': epoch_acc.item ()} def epoch_end (self, epoch, result): pr int ("Epoch:", epoch + 1) print (f'Train Accuracy: {result ["train_accuracy"]*100: .2f}% Ακρίβεια επικύρωσης: {result ["Accuracy"]*100: .2f}% ' ) εκτύπωση (f'Train Loss: {result ["train_loss"] :. 4f} Απώλεια επικύρωσης: {result ["Loss"] :. 4f} ')

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

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

Εφαρμογή συνθετικής ενότητας νευρωνικού δικτύου

class Cifar10CnnModel (ImageClassificationBase): def __init __ (self): super () .__ init __ () self.network = nn.Aequential (nn.Conv2d (3, 32, kernel_size = 3, padding = 1), nn.ReLU (), nn.Conv2d (32, 64, kernel_size = 3, stride = 1, padding = 1), nn.ReLU (), nn.MaxPool2d (2, 2), # έξοδος: 64 x 16 x 16 nn.BatchNorm2d (64) , nn.Conv2d (64, 128, kernel_size = 3, stride = 1, padding = 1), nn.ReLU (), nn.Conv2d (128, 128, kernel_size = 3, stride = 1, padding = 1), nn .ReLU (), nn.MaxPool2d (2, 2), # έξοδος: 128 x 8 x 8 nn. BatchNorm2d (128), nn.Conv2d (128, 256, kernel_size = 3, stepide = 1, padding = 1), nn.ReLU (), nn.Conv2d (256, 256, kernel_size = 3, stepide = 1, padding = 1), nn.ReLU (), nn.MaxPool2d (2, 2), # έξοδος: 256 x 4 x 4 nn.BatchNorm2d (256), nn.Flatten (), nn.Linear (256*4*4, 1024), nn.ReLU (), nn.Linear (1024, 512), nn.ReLU (), nn.Linear (512, 10)) def forward (self, xb): return self.network (xb)

Αυτό είναι το πιο σημαντικό μέρος της εφαρμογής νευρωνικών δικτύων. Καθ 'όλη τη διάρκεια, χρησιμοποιούμε τη μονάδα nn που εισάγαμε από το torch. Όπως μπορούμε να δούμε στην πρώτη γραμμή, το Conv2d είναι μια ενότητα που βοηθά στην υλοποίηση ενός συνελικτικού νευρωνικού δικτύου. Η πρώτη παράμετρος 3 εδώ αντιπροσωπεύει ότι η εικόνα είναι έγχρωμη και σε μορφή RGB. Αν ήταν μια εικόνα σε κλίμακα του γκρι, θα είχαμε πάει για 1.

Το 32 είναι το μέγεθος του αρχικού καναλιού εξόδου και όταν πάμε για το επόμενο στρώμα conv2d θα έχουμε αυτό το 32 ως κανάλι εισόδου και το 64 ως κανάλι εξόδου.

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

Η λειτουργία περιστροφής συνδέεται με ένα επίπεδο ενεργοποίησης και Relu εδώ. Μετά από δύο στρώματα Conv2d, έχουμε μια μέγιστη λειτουργία συγκέντρωσης μεγέθους 2 * 2. Η τιμή που προκύπτει από αυτήν είναι ομαλοποιημένη κατά παρτίδα για σταθερότητα και για αποφυγή εσωτερικής εναλλαγής μεταβλητών. Αυτές οι λειτουργίες επαναλαμβάνονται με περισσότερα επίπεδα για να εμβαθύνουν το δίκτυο και να μειώσουν το μέγεθος. Τέλος, ισιώνουμε το επίπεδο έτσι ώστε να μπορέσουμε να δημιουργήσουμε ένα γραμμικό επίπεδο για να αντιστοιχίσουμε τις τιμές σε 10 τιμές. Η πιθανότητα κάθε νευρώνα από αυτούς τους 10 νευρώνες θα καθορίσει σε ποια κατηγορία ανήκει μια συγκεκριμένη εικόνα με βάση τη μέγιστη πιθανότητα.

Εκπαιδεύστε το μοντέλο

@torch.no_grad () def vlerës (model, data_loader): model.eval () outputs = [model.validation_step (batch) for batch in data_loader] return model.validation_epoch_end (outputs) def fit (model, train_loader, val_loader, epochs = 10, learning_rate = 0.001): best_valid = Κανένα ιστορικό = [] optimizer = torch.optim.Adam (model.parameters (), learning_rate, weight_decay = 0.0005) για εποχή σε εύρος (εποχές): # Εκπαιδευτικό Φάση μοντέλο. Τρένο ( ) train_losses = [] train_accuracy = [] for batch in tqdm (train_loader): loss, accu = model.training_step (batch) train_losses.append (loss) train_accuracy.append (accu) loss.backward () optimizer.step () optimizer .zero_grad () # Αποτέλεσμα φάσης επικύρωσης = αξιολογήστε (μοντέλο, val_loader) αποτέλεσμα ['train_loss'] = torch.stack (απώλειες τρένων). μέσο (). στοιχείο () αποτέλεσμα ['train_accuracy'] = torch.stack (τρένο_ακρίβεια) mean (). item () model.epoch_end (εποχή, αποτέλεσμα) if (best_valid == Καμία ή best_valid
ιστορία = προσαρμογή (μοντέλο, train_dl, val_dl)

Αυτό είναι ένα βασικό βήμα για να εκπαιδεύσουμε το μοντέλο μας ώστε να έχει το απαιτούμενο αποτέλεσμα. η συνάρτηση προσαρμογής εδώ θα ταιριάζει στα δεδομένα τρένου και Val με το μοντέλο που δημιουργήσαμε. Η συνάρτηση προσαρμογής λαμβάνει αρχικά μια λίστα που ονομάζεται ιστορία και φροντίζει για τα δεδομένα επανάληψης κάθε εποχής. Εκτελούμε έναν βρόχο for έτσι ώστε να μπορούμε να επαναλαμβανόμαστε σε κάθε εποχή. Για κάθε παρτίδα, βεβαιωνόμαστε ότι εμφανίζουμε την πρόοδο χρησιμοποιώντας το tqdm. Ονομάζουμε το εκπαιδευτικό βήμα που εφαρμόσαμε πριν και υπολογίζουμε την ακρίβεια και την απώλεια. Πηγαίνετε για αναδρομική διάδοση και βελτιστοποίηση εκτέλεσης που ορίσαμε νωρίτερα. Μόλις το κάνουμε αυτό, παρακολουθούμε τη λίστα μας και οι λειτουργίες μας βοηθούν να εκτυπώσουμε τις λεπτομέρειες και την πρόοδο.

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

Σχεδιάζοντας τα αποτελέσματα

Σε αυτό το βήμα, θα απεικονίσουμε την ακρίβεια έναντι κάθε εποχής. Μπορούμε να παρατηρήσουμε ότι καθώς αυξάνεται η εποχή, η ακρίβεια του συστήματος συνεχίζει να αυξάνεται και ομοίως η απώλεια συνεχίζει να μειώνεται. Η κόκκινη γραμμή εδώ δείχνει την πρόοδο των δεδομένων εκπαίδευσης και μπλε για την επικύρωση. Μπορούμε να δούμε ότι υπήρξε μια καλή ποσότητα υπερπροσαρμογής στα αποτελέσματά μας, καθώς τα δεδομένα εκπαίδευσης υπερτερούν αρκετά του αποτελέσματος επικύρωσης και ομοίως σε περίπτωση απώλειας. Μετά από 10 εποχές, τα δεδομένα του τρένου φαίνεται να παρακάμπτουν την ακρίβεια του 90% αλλά έχουν απώλεια περίπου 0.5. Τα δεδομένα των δοκιμών έρχονται γύρω στο 81% και οι απώλειες είναι κοντά στο 0.2.

def plot_accuracies (history): Validation_accuracies = [x ['Accuracy'] for x in history] Training_Accuracies = [x ['train_accuracy'] for x in history] plt.plot (Training_Accuracies, '-rx') plt.plot (Validation_accuracies , '-bx') plt.xlabel ('εποχή') plt.ylabel ('ακρίβεια') plt.legend (['' Εκπαίδευση '', 'Επικύρωση']) plt.title ('Ακρίβεια έναντι αριθμού εποχών') ? οικόπεδα_ακρίβειες (ιστορία)
Σχέδια ακρίβειας
def plot_losses (history): train_losses = [x.get ('train_loss') for x in history] val_losses = [x ['Loss'] for x in history] plt.plot (train_losses, '-bx') plt.plot (val_losses, '-rx') plt.xlabel ('epoch') plt.ylabel ('loss') plt.legend (['' Training ',' Validation ']) plt.title (' Απώλεια έναντι αριθμού εποχών ')? plot_losses (ιστορία)

test_dataset = ImageFolder (data_dir+'/test', transform = ToTensor ()) test_loader = DeviceDataLoader (DataLoader (test_dataset, batch_size), συσκευή) αποτέλεσμα = αξιολόγηση (τελικό_μοντέλο, test_loader) εκτύπωση (f'Test Ακρίβεια: {αποτέλεσμα ["Ακρίβεια" ]*100: .2f}%')
Ακρίβεια δοκιμής: 81.07%

Μπορούμε να δούμε ότι καταλήγουμε με ακρίβεια 81.07%.

Συμπέρασμα:

Εικόνα: https: //unsplash.com/photos/5L0R8ZqPZHk

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

Πηγή εικόνας

  1. Image 1: https://becominghuman.ai/cifar-10-image-classification-fd2ace47c5e8
  2. Εικόνα 2: https://www.analyticsvidhya.com/blog/2021/05/convolutional-neural-networks-cnn/

Μη διστάσετε να συνδεθείτε μαζί μου στο:

  1.  Linkedin: https://www.linkedin.com/in/siddharth-m-426a9614a/
  2.  Github: https://github.com/Siddharth1698

Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του Συντάκτη.

Πηγή: https://www.analyticsvidhya.com/blog/2021/09/convolutional-neural-network-pytorch-implementation-on-cifar10-dataset/

Σφραγίδα ώρας:

Περισσότερα από Ανάλυση Vidhya