Die Trainingsumgebung:- Ich habe Kaggle’s Pocket book für die Erstellung dieses Modells verwendet, da der Zugriff auf TPUs kostenlos und einfach ist, und empfehle die Verwendung. Dieses Modell wurde auf TPU-V3 in 1,75 Minuten trainiert, aber seien Sie versichert, das Modell trainiert auch einwandfrei auf GPUs, aber selbst wenn es auf einer NVIDIA H100 trainiert wird, dauert es siebenmal so lange wie das Coaching auf der TPU. Aber das ist sowieso nicht der Grund, warum Sie hier sind, additionally lassen Sie mich Sie durch den Datensatz und dann durch das Modelltraining und Testen führen.
Der Datensatz:- Der Datensatz battle HAM10000. Es besteht aus 10015 Bildern in zwei verschiedenen Ordnern mit den Namen Teil 1 und Teil 2. Es gibt einige CSV-Dateien, die pixelweise Daten zu den Bildern enthalten, aber ich werde sie in diesem Projekt nicht verwenden. Es gibt auch eine CSV-Datei mit Metadaten zu den Bildern. Die Metadaten für jedes Bild können durch das Bild-ID-Attribut identifiziert werden, das eigentlich der Dateiname für dieses Bild ist. Die Metadaten enthielten Informationen über Lesion_id, Alter, Geschlecht, Lokalisierung der Läsion im Körper, die bei der Diagnose verwendete Methode und die Artwork der Diagnose. Die Artwork der Diagnose ist es, auf die ich als Klassifizierungsbezeichnung für dieses Projekt abzielen werde.
Aufbereitung der Daten:- Ich beginne damit, zuerst die Metadaten-CSV mit Pandas zu lesen. Ich nenne den Datenrahmen Krebs. Bei der Überprüfung der Daten mit der Methode information() stelle ich fest, dass die Altersspalte einige Nullwerte enthält, die ich durch das Durchschnittsalter ersetze. Am Ende battle es nicht nötig; Ich hätte die Altersspalte weglassen können und alles wäre immer noch in Ordnung gewesen. Als Nächstes füge ich dem Datenrahmen eine Spalte hinzu, die die Pfade der Bilddatei enthält, zu der die Metadaten im Datenrahmen enthalten sind. Dazu erstelle ich zunächst ein Wörterbuch der Bildpfade und Bild-IDs und ordne dann die Bild-ID-Spalte diesem Wörterbuch zu. Außerdem werden Beschriftungen aus der Spalte „dx“ extrahiert, die den Typ der Diagnose enthält, und dann wird eine One-Scorching-Codierung darauf ausgeführt. Ich finde, dass es 7 verschiedene Diagnoseklassen gibt.
Als nächstes nehme ich die Pfadspalte und konvertiere den Beschriftungsdatenrahmen in eine Liste von One-Scorching-Vektoren, komprimiere sie beide und konvertiere sie in eine Liste. So erhalte ich einen vorläufigen Datensatz, der die Pfade der Bilder und die Beschriftungen dafür enthält. Ich mische die Daten und entpacke sie dann. Anschließend verwende ich die Methode from_tensor_slices(), um unsere Daten in Kind von Tensoren abzurufen.
Dann schreibe ich eine Funktion namens final_data, der ich den Datensatz zuordne, um unseren endgültigen Datensatz zu erhalten. Die Funktion verwendet den Pfad und die Beschriftung als Eingabe, liest das Bild, dekodiert es und ändert die Größe von 450 x 600 auf 90 x 120. Die Werte liegen zwischen 0 und 255. Um es für die Einspeisung in das Modell vorzubereiten, skaliere ich es von 0 auf 1. Anschließend gebe ich die dekodierten Bilddaten und die Beschriftungen zurück und somit ist unser endgültiger Datensatz fertig.
Aber jetzt muss ich die Daten auch in Trainings-, Check- und Validierungssätze aufteilen, und genau das mache ich.
Nachdem der Datensatz nun vorbereitet und aufgeteilt ist, ist es an der Zeit, mit der Modellerstellung zu beginnen.
Bevor ich jedoch zum Teil des Modellbaus komme, möchte ich etwas näher erläutern. Dieses Pocket book wird auf Kaggle geschrieben, damit ich für schnelleres Coaching auf die GPU zugreifen kann. Ich werde für dieses Projekt zwei T4-GPUs von Kaggle verwenden. Ich werde die gespiegelte Strategie verwenden, um die Rechenleistung auf beide GPUs zu verteilen, da TensorFlow standardmäßig nur die erste GPU verwendet.
Auswahl des richtigen Modelltyps: – Da die Metadaten Informationen über Alter, Geschlecht, Diagnosemethode, Läsions-ID und Lokalisierung enthielten, battle ich zunächst versucht, ein sehr komplexes Modell zu verwenden, das vier verschiedene Eingabesätze benötigte: Alter, One-Scorching-codierte kategoriale Merkmale (Geschlecht, Methode zur Diagnose und Lokalisierung), die Läsions-ID, die an eine Einbettungsschicht gesendet wird, und die Bildeingabe, die an eine Schicht von CNNs oder zum Transferlernen auf einem vorab trainierten Modell wie ResNet oder Xception gesendet wird. Allerdings schien die Architektur dieses Modells für die vorliegende Aufgabe etwas zu komplex zu sein, und ich dachte, warum nicht einfach ein relativ einfaches Modell ausprobieren, das nur die Bildeingabe nimmt, sie an eine Faltungsebene weiterleitet, einige Dropouts hinzufügt und Batch-Normalisierung und sehen Sie, wie es geht. Falls es nicht intestine funktionierte, konnte ich jederzeit das Multi-Enter-Modell erstellen. Und wie sich herausstellen wird, hat dieses relativ einfache Modell gute Ergebnisse erzielt und beim Testsatz eine Genauigkeit von 100 % erreicht.
Erstellen und Trainieren des Modells: – Ich beginne mit der Angabe der Strategie (in diesem Fall der gespiegelten Strategie), indem ich die Methode „scope()“ aufrufe. Dann erstelle ich ein sequentielles Modell. Das Modul tf.keras und seine Komponentenklassen werden häufig zum Erstellen dieses Modells verwendet.
Die erste Ebene ist eine 2D-Faltung mit 30 Filtern und einer Kernelgröße von 5 x 5 und einer Schrittweite von 1 x 1. Nur zur Klarstellung: Ich habe die Schrittweite in allen Faltungsschichten im Modell bei 1 x 1 gehalten, da ich den Datenverlust möglichst gering halten und gleichzeitig reduzieren möchte Dimensionalität. Ich verwende kein Zero-Padding, daher ist das Padding auf „gültig“ gesetzt. Der Grund dafür ist, dass Zero-Padding zu einer stärkeren Darstellung von Pixeln in der Nähe der Bildgrenzen in den tieferen Schichten der Modelle beiträgt. Da sich der Großteil unserer Daten zu Läsionen jedoch im inneren Teil der Bilder befindet, werde ich das nicht tun werde es brauchen. Somit bleibt im gesamten Modell derselbe Füllwert erhalten. Ich verwende die Relu-Aktivierungsfunktion im gesamten Modell, mit Ausnahme der Ausgabeebene, die zufällig die Standardpraxis ist.
Hinweis: – Die hier genannten Formen gelten für jedes einzelne Exemplar und nicht für die gesamte Cost.
Jetzt ist die Eingabeform in der ersten Ebene (90,120,3), die nach dem Durchlaufen der ersten Ebene in (86,116,30) geändert wird. Als nächstes füge ich eine weitere 2D-Faltungsschicht mit 30 Filtern und einem 3×3-Kernel hinzu. Dadurch werden die Funktionen weiter konzentriert, wenn auch in geringem Maße. Diese Ebene hat eine Ausgabeform von (84,114,30). Zu diesem Zeitpunkt füge ich eine Batch-Normalisierungsschicht und eine 2D-MaxPool-Schicht mit einer Poolgröße von 2×2 hinzu, um die stärksten Options zu erfassen und den Relaxation zu verwerfen. Diese Ebene reduziert die Kind der ersten beiden Dimensionen um die Hälfte, sodass die Ausgabeform in dieser Part (42,57,30) ist. Dann füge ich nacheinander drei weitere 2D-Faltungsschichten mit einer Kernelgröße von 3×3 und jeweils 20, 15 und 15 Filtern hinzu. Die Ausgabeform nach der letzten solchen Ebene ist zufällig (36,51,15). In dieser Part füge ich eine Gruppennormalisierungsebene mit drei Gruppen hinzu, die die 15 Kanäle in drei Gruppen zu je 5 unterteilt und eine Normalisierung für jede Gruppe durchführt. Dann füge ich erneut eine Max-Pooling-Ebene mit der Poolgröße (2,2) hinzu, um die stärksten Options zu erfassen und den Relaxation zu verwerfen, während ich gleichzeitig die Ausgabeform auf (18,25,15) reduziere.
Ich füge eine weitere 2D-Faltungsebene mit 10 Filtern und einer Kernelgröße von 3×3 hinzu, was eine Ausgabe der Kind (16,23,10) ergibt, und glätte dann die Ausgabe dieser Ebene und normalisiere sie stapelweise, indem ich eine Abflachungsebene und eine Stapelnormalisierungsebene verwende. Nach der Reduzierung und Batch-Normalisierung nimmt die Ausgabe die Kind (3680) an.
Ich verbinde es mit einer dichten Schicht mit 256 Neuronen und füge dann Batch-Normalisierung und Dropout hinzu, um das Risiko einer Überanpassung zu verringern. Dann füge ich eine dichte Schicht mit 128 Neuronen hinzu und verbinde sie schließlich mit der dichten Ausgabeschicht mit 7 Neuronen mit einer Softmax-Aktivierung, da es in unserer Aufgabe 7 Klassen diagnostischer Läsionen gibt. Ich kompiliere das Modell und bin bereit, mit dem Coaching fortzufahren, aber zuerst muss ich einige Rückrufe schreiben. Außerdem ist unten die Architektur des Modells aufgeführt.
Rückrufe: – Ich werde drei sehr wichtige Rückrufe schreiben, von denen zwei ziemlich standardmäßig sind: Frühzeitiges Stoppen und Modellspeicherungs-Checkpoint. Der Dritte, den ich schreiben werde, ist ein Lernratenplaner, der die Lernrate im Verlauf des Trainings reduziert. Ich hatte auch einen Rückruf zum Löschen des Speichers geschrieben, den ich hätte verwenden können, falls die GPU zu überlastet wäre, aber das brauchte ich nicht.
Jetzt passe ich das Modell an und trainiere es. Ich habe die Chargengröße 60 beibehalten und mit dieser großen Chargengröße battle die Leistung tatsächlich besser als mit den kleineren Chargengrößen 8,12,16,20,28 und 32, die ich zuvor ausprobiert hatte und die nicht so intestine funktionierten.
Wenn ich nach dem Coaching die Trainingsprotokolle durchsehe, kann ich feststellen, dass es keinen großen Unterschied zwischen der Trainingsgenauigkeit und der Validierungsgenauigkeit gibt, sodass das Modell nicht überangepasst ist. Als nächstes gehe ich zum Testen über. Ich lade die beste gespeicherte Model des Modells und durchlaufe den gesamten Testsatz, um die Vorhersagen zu erhalten.
Die Vorhersagen liegen in Wahrscheinlichkeitsform vor, daher schreibe ich eine Funktion mit dem Namen „Ausgaben“, um sie in die Beschriftungsform umzuwandeln.
Außerdem werden die Etiketten im Testsatz gestapelt, additionally extrahiere ich die Etiketten und berechne dann den Genauigkeitswert, der, wie sich herausstellt, 100 % beträgt.
Wir verfügen nun über ein Hautkrebserkennungs- und -klassifizierungsmodell, das mit 100 % Genauigkeit auf dem Testsatz funktioniert. Der nächste Schritt ist die Bereitstellung und Überwachung dieses Modells, dh die Produktion des Modells, worüber ich in einem zukünftigen Artikel schreiben werde.