Ein praktischer Leitfaden zum Aufbau Ihres ersten Modells für ein neuronales Faltungsnetzwerk

Inhalt

Dieser Artikel wurde im Rahmen der Data Science Blogathon

Überblick

In diesem Artikel wird kurz auf CNN . eingegangen, eine spezielle Variante neuronaler Netze, die speziell für bildbezogene Aufgaben entwickelt wurde. Der Artikel konzentriert sich hauptsächlich auf den Implementierungsteil von CNN. Es wurden alle Anstrengungen unternommen, um diesen Artikel interaktiv und unkompliziert zu gestalten.. Viel Spaß beim Lernen !!

97717Katzen-Hunde-Klassifizierung-Deep-Learning-1501313

Bildquelle

Einführung

Convolutional Neural Networks wurden im Jahr von Yann LeCun und Yoshua Bengio eingeführt 1995 die später außergewöhnliche Ergebnisse im Bereich der Bilder zeigte. Dann, Was sie im Vergleich zu gewöhnlichen neuronalen Netzen bei der Anwendung im Bildbereich besonders machte? Einen der Gründe erkläre ich an einem einfachen Beispiel. Bitte beachten Sie, dass Sie mit der Klassifizierung von handgeschriebenen Ziffernbildern beauftragt wurden und dass einige Beispieltrainingssätze unten gezeigt werden.

17125Ziffern-8105946

Bildquelle

Wenn du richtig beobachtest, Sie können feststellen, dass alle Ziffern in der Mitte der jeweiligen Bilder erscheinen. Das Training eines normalen neuronalen Netzmodells mit diesen Bildern kann zu guten Ergebnissen führen, wenn das Testbild von einem ähnlichen Typ ist. Aber, Was ist, wenn das Testbild wie unten aussieht??

83083digit_resized-5205563

Bildquelle

Hier erscheint die Zahl Neun in der Ecke des Bildes. Wenn wir ein einfaches neuronales Netzmodell verwenden, um dieses Bild zu klassifizieren, unser Modell kann abrupt versagen. Aber wenn das gleiche Testbild einem CNN-Modell gegeben wird, es wird sehr wahrscheinlich richtig klassifiziert. Der Grund für die bessere Leistung ist, dass nach räumlichen Merkmalen im Bild gesucht wird. Für den obigen Fall selbst, auch wenn die Zahl Neun in der linken Ecke des Rahmens steht, das trainierte CNN-Modell erfasst die Merkmale im Bild und sagt wahrscheinlich voraus, dass die Zahl die Ziffer Neun ist. Ein normales neuronales Netzwerk kann diese Art von Magie nicht ausführen. Lassen Sie uns nun kurz die Hauptbausteine ​​von CNN besprechen.

Hauptkomponenten der Architektur eines CNN-Modells

34881cnn_architecture_1-9806946

Bildquelle

Dies ist ein einfaches CNN-Modell, das erstellt wurde, um zu klassifizieren, ob das Bild eine Katze enthält oder nicht. Dann, die Hauptkomponenten eines CNN sind:

1. Faltdeckel

2. Gruppierungsebene

3.Vollständig verbundene Schicht

Faltdeckel

Faltungsebenen helfen uns, die im Bild vorhandenen Merkmale zu extrahieren. Diese Extraktion wird mit Hilfe von Filtern erreicht. Beachten Sie den folgenden Vorgang.

36813convolution_overview-6828931

Bildquelle

Hier sehen wir, dass ein Fenster über das gesamte Bild gleitet, wo das Bild als Raster gerendert wird (So sieht der Computer Bilder, bei denen die Raster mit Zahlen gefüllt sind!!). Sehen wir uns nun an, wie die Berechnungen in der Faltungsoperation durchgeführt werden.

89792Faltungsbeispiel-1304619

Bildquelle

Angenommen, die Karte der Eingangseigenschaften ist unser Bild und der Faltungsfilter ist das Fenster, über das wir gleiten werden. Schauen wir uns nun eine der Instanzen der Faltungsoperation an.

578272021-07-202023_09_31-ml20practicum_20image20classification20c2a0_c2a020google20developers-1471699

Bildquelle

Wenn der Faltungsfilter dem Bild überlagert ist, die jeweiligen Elemente werden multipliziert. Später, die multiplizierten Werte werden addiert, um einen einzelnen Wert zu erhalten, der in der Ausgabe-Feature-Map ausgefüllt wird. Dieser Vorgang wird fortgesetzt, bis wir das Fenster über das Kennfeld der Eingabeeigenschaften schieben., damit das Ausgangskennfeld füllen.

Gruppierungsebene

Die Idee hinter der Verwendung eines Gruppierungs-Layers besteht darin, die Dimension der Feature-Map zu reduzieren. Für die unten angegebene Darstellung, Wir haben eine maximale Gruppierungsschicht von verwendet 2 * 2. Jedes Mal gleitet das Fenster über das Bild, wir nehmen den maximalen Wert innerhalb des Fensters.

66402maxpool_animation-3565648

Bildquelle

Schließlich, nach maximalem Gruppenbetrieb, Wir können hier sehen, dass die Dimension der Eingabe, nämlich, 4 * 4, wurde reduziert auf 2 * 2.

Vollständig verbundene Schicht

Diese Schicht ist im hinteren Abschnitt der CNN-Modellarchitektur vorhanden, wie zuvor zu sehen. Die Eingabe für die vollständig verbundene Schicht sind die reichhaltigen Merkmale, die durch Faltungsfilter extrahiert wurden. Diese breitet sich dann weiter zur Ausgabeschicht aus, wobei wir die Wahrscheinlichkeit erhalten, dass das Eingabebild zu verschiedenen Klassen gehört. Das vorhergesagte Ergebnis ist die Klasse mit der höchsten Wahrscheinlichkeit, die das Modell vorhergesagt hat.

Codeimplementierung

Hier nehmen wir den Fashion MNIST als unseren Problemdatensatz. Der Datensatz enthält T-Shirts, Hose, Pullover, Kleider, Mäntel, Flip Flops, Hemden, Schuhe, Taschen und Stiefeletten. Die Aufgabe besteht darin, nach dem Training des Modells ein bestimmtes Bild in die oben genannten Klassen einzuordnen.

61674fashion20mnist20dataset-5124604

Bildquelle

Wir implementieren den Code in Google Colab, da sie die Nutzung kostenloser GPU-Ressourcen für einen festgelegten Zeitraum zur Verfügung stellen. Wenn Sie neu in der Colab-Umgebung und den GPUs sind, Überprüfen Sie diesen Blog, um eine bessere Vorstellung zu bekommen. Unten ist die CNN-Architektur, die wir bauen werden.

92912inkedoverlayed_li-4824968

Paso 1: Importieren Sie die erforderlichen Bibliotheken

Importieren von OS
Taschenlampe importieren
Torchvision importieren
Tarfile importieren
aus Torchvision Import transformiert
aus Torch.utils.data import random_split
aus Torch.utils.data.dataloader importieren DataLoader
brenner.nn als nn importieren
aus fackel.nn Importfunktion als F
aus der itertools-Importkette

Paso -2: Herunterladen des Test- und Trainingsdatensatzes

train_set = Torchvision.datasets.FashionMNIST("/usr", herunterladen=Wahr, transform=
                                                transformiert.Verfassen([transformiert.ToTensor()]))
test_set = Torchvision.datasets.FashionMNIST("./Daten", herunterladen=Wahr, train=Falsch, transform=
                                               transformiert.Verfassen([transformiert.ToTensor()]))

Paso 3 Aufteilung des Trainingssets für Training und Validierung

train_size = 48000
val_size = 60000 - train_size
train_ds,val_ds = random_split(train_set,[train_size,Wert_Größe])

Paso 4 Laden Sie den Datensatz mit dem Dataloader . in den Speicher

train_dl = DataLoader(train_ds,batch_size=20,shuffle=True)
val_dl = DataLoader(val_ds,batch_size=20,shuffle=True)
Klassen = train_set.classes

Lassen Sie uns nun die geladenen Daten visualisieren,

für Bilder,Etiketten in train_dl:
  für img in imgs:
    arr_ = np.squeeze(img) 
    plt.zeigen()
    brechen
  brechen
68552batch20data20visualisierung-1348502

Paso -5 Definieren der Architektur

brenner.nn als nn importieren
brenner.nn.funktional als F importieren
#definiere die CNN-Architektur
Klasse Net(nn.Modul):
    def __init__(selbst):
        Super(Netz, selbst).__drin__()
        #Faltungsschicht-1
        self.conv1 = nn.Conv2d(1,6,5, padding=0)
        #Faltungsschicht-2
        self.conv2 = nn.Conv2d(6,10,5,padding=0)
        # maximale Pooling-Schicht
        self.pool = nn.MaxPool2d(2, 2)
        # Vollständig verbundene Schicht 1
        self.ff1 = nn.Linear(4*4*10,56)
        # Vollständig verbundene Schicht 2
        self.ff2 = nn.Linear(56,10)
    def vorwärts(selbst, x):
        # Hinzufügen einer Sequenz von Faltungs- und Max-Pooling-Schichten
        #Eingangsdimmung-28*28*1
        x = self.conv1(x)
        # Nach der Faltungsoperation, Ausgangsdimmung - 24*24*6
        x = self.pool(x)
        # Nach Max. Poolbetrieb Ausgangsdimmung - 12*12*6
        x = self.conv2(x)
        # Nach der Faltungsoperation Ausgangsdimmung - 8*8*10
        x = self.pool(x)
        # Max. Pool-Ausgangsdimmung 4*4*10
        x = x.Ansicht(-1,4*4*10) # Umformen der Werte in eine Form, die für die Eingabe des vollständig verbundenen Layers geeignet ist
        x = F.relu(selbst.ff1(x)) # Anwenden von Relu auf die Ausgabe der ersten Ebene
        x = F.sigmoid(selbst.ff2(x)) # Anwenden von Sigmoid auf die Ausgabe der zweiten Ebene
        Rückgabe x

# Erstellen Sie ein vollständiges CNN
model_scratch = Net()
drucken(Modell)
# Tensoren auf GPU verschieben, wenn CUDA verfügbar ist
wenn use_cuda:
    model_scratch.cuda()

Paso 6: Definition der Verlustfunktion

# Verlustfunktion
brenner.nn als nn importieren
brenner.optim als optim importieren
Kriterium_scratch = nn.CrossEntropyLoss()
def get_optimizer_scratch(Modell):
    Optimierer = optim.SGD(modell.parameter(),lr = 0.04)
    Renditeoptimierer

Paso 7: Implementierung des Trainings- und Validierungsalgorithmus

# Implementierung des Trainingsalgorithmus
def zug(n_epochen, Lader, Modell, Optimierer, Kriterium, use_cuda, save_path):
    """gibt trainiertes Modell zurück"""
    # Tracker für minimalen Validierungsverlust initialisieren
    valid_loss_min = np.Inf
    für Epoche in Reichweite(1, n_epochen+1):
        # Variablen initialisieren, um Trainings- und Validierungsverluste zu überwachen
        train_loss = 0.0
        valid_loss = 0.0
        # Zugphase #
        # das Modul in den Trainingsmodus versetzen
        modell.zug()
        für batch_idx, (Daten, Ziel) aufzählen(Lader['Bahn']):
            # auf GPU wechseln
            wenn use_cuda:
                Daten, Ziel = data.cuda(), ziel.cuda()
            optimizer.zero_grad()
            Ausgabe = Modell(Daten)
            Verlust = Kriterium(Ausgang, Ziel)
            verlust.rückwärts()
            Optimierer.Schritt()
            train_loss = train_loss + ((1 / (batch_idx + 1)) * (verlust.daten.element() - train_loss))
        # validiere das Modell #
        # Setzen Sie das Modell in den Evaluierungsmodus
        model.eval()
        für batch_idx, (Daten, Ziel) aufzählen(Lader['gültig']):
            # auf GPU wechseln
            wenn use_cuda:
                Daten, Ziel = data.cuda(), ziel.cuda()
            Ausgabe = Modell(Daten)
            Verlust = Kriterium(Ausgang, Ziel)
            valid_loss = valid_loss + ((1 / (batch_idx + 1)) * (verlust.daten.element() - valid_loss))
# Trainings-/Validierungsstatistik drucken
        drucken('Epoche: {} tTrainingsverlust: {:.6F} tValidierungsverlust: {:.6F}'.Format(
            Epoche, 
            train_loss,
            valid_loss
            ))
## Wenn sich der Validierungsverlust verringert hat, dann das Modell speichern
        if valid_loss <= valid_loss_min:
            drucken('Validierungsverlust verringert ({:.6F} --> {:.6F}).  Modell speichern ...'.format(
            valid_loss_min,
            valid_loss))
            fackel.save(model.state_dict(), save_path)
            valid_loss_min = valid_loss
    Rückgabemodell

Paso 8: Trainings- und Evaluierungsphase

num_epochen = 15
model_scratch = trainieren(Anzahl_Epochen, loaders_scratch, model_scratch, get_optimizer_scratch(model_scratch), 
                      Kriterium_scratch, use_cuda, 'model_scratch.pt')
71233training20and20validation20phase-5227760

Beachten Sie, dass jedes Mal, wenn der Validierungsverlust abnimmt, wir speichern den zustand des modells.

Paso 9 Testphase

def test(Lader, Modell, Kriterium, use_cuda):
# Überwachen Sie den Testverlust und die Genauigkeit
    test_loss = 0.
    richtig = 0.
    gesamt = 0.
# Setzen Sie das Modul in den Auswertemodus
    model.eval()
    für batch_idx, (Daten, Ziel) aufzählen(Lader['Prüfung']):
          # auf GPU wechseln
          wenn use_cuda:
            Daten, Ziel = data.cuda(), ziel.cuda()
          # Vorwärtspass: vorhergesagte Ausgaben berechnen, indem Eingaben an das Modell übergeben werden
          Ausgabe = Modell(Daten)
          # Berechnen Sie den Verlust
          Verlust = Kriterium(Ausgang, Ziel)
          # durchschnittlichen Testverlust aktualisieren
          test_loss = test_loss + ((1 / (batch_idx + 1)) * (verlust.daten.element() - test_loss))
          # Ausgabewahrscheinlichkeiten in vorhergesagte Klasse umwandeln
          pred = output.data.max(1, keepdim=Wahr)[1]
          # vergleiche Vorhersagen mit echtem Label
        richtig += np.summe(np.squeeze(pred.eq(target.data.view_as(pred)),Achse=1).Zentralprozessor().numpy())
        gesamt += data.size(0)
 drucken('Testverlust: {:.6F}n'.format(test_loss))
drucken('nTest-Genauigkeit: %2D%% (%2d /% 2d)' % (
        100. * Korrekt / gesamt, Korrekt, gesamt))
# Laden Sie das Modell mit der besten Validierungsgenauigkeit
model_scratch.load_state_dict(fackel.laden('model_scratch.pt'))
Prüfung(loaders_scratch, model_scratch, Kriterium_scratch, use_cuda)
98117test_phase-2728290

Paso 10 Mit einer Probe testen

Die Funktion, die zum Testen des Modells mit einem einzelnen Bild definiert ist.

def predict_image(img, Modell):
    # In einen Stapel von . umwandeln 1
    xb = img.unsqueeze(0)
    # Vorhersagen vom Modell abrufen
    yb = Modell(xb)
    # Wählen Sie den Index mit der höchsten Wahrscheinlichkeit
    _, preds = brenner.max(yb, dim=1)
    # das Bild drucken
    plt.imshow(img.squeeze( ))
    #das Klassenlabel für das Bild zurückgeben
    zurück train_set.classes[Preds[0].Artikel()]
img,label = test_set[9]
predict_image(img,model_scratch)
46606single20test20case-1771345

Fazit

Hier hatten wir kurz die Hauptoperationen in einem konvolutionellen neuronalen Netz und seine Architektur besprochen. Ein einfaches Faltungsneuralnetzwerkmodell wurde ebenfalls implementiert, um eine bessere Vorstellung vom praktischen Anwendungsfall zu erhalten. Sie finden den implementierten Code in my GitHub-Repository. Was ist mehr, Sie können die Leistung des bereitgestellten Modells verbessern, indem Sie den Datensatz vergrößern, Verwendung von Regularisierungstechniken wie Batch-Normalisierung und Aufgabe auf vollständig verbundenen Schichten der Architektur. Was ist mehr, Beachten Sie, dass auch vortrainierte CNN-Modelle verfügbar sind, die mit großen Datensätzen trainiert wurden. Durch die Verwendung dieser Modelle der neuesten Generation, Sie werden zweifellos die besten Messwerte für ein bestimmtes Problem erzielen.

Verweise

  1. https://www.youtube.com/watch?v = EHuACSjijbI – Jupiter
  2. https://www.youtube.com/watch?v = 2-Ol7ZB0MmU&t=1503s- Eine freundliche Einführung in konvolutionelle neuronale Netze und Bilderkennung

Über den Autor

Mein Name ist Adwait Dathan, Ich studiere derzeit meinen Master in Künstlicher Intelligenz und Data Science. Fühlen Sie sich frei, mit mir in Verbindung zu treten Linkedin.

Die in diesem Artikel gezeigten Medien sind nicht Eigentum von DataPeaker und werden nach Ermessen des Autors verwendet.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.