Mustererkennung mit einem flachen neuronalen Netz
Neben der Funktionsanpassung eignen sich neuronale Netze auch gut zum Erkennen von Mustern.
Angenommen, Sie möchten einen Tumor anhand der Klumpendicke, der Gleichmäßigkeit der Zellengröße, der Mitose usw. als gutartig oder bösartig klassifizieren. Es liegen Ihnen 699 Beispielfälle vor, für die Sie 9 Merkmale und die korrekte Klassifizierung als gutartig oder bösartig kennen.
Genau wie bei der Funktionsanpassung gibt es auch für dieses Problem zwei Lösungswege:
Verwendung der App Neural Net Pattern Recognition wie in Mustererkennung mit der App „Neural Net Pattern Recognition“ beschrieben.
Verwendung von Befehlszeilenfunktionen wie in Mustererkennung mithilfe von Befehlszeilenfunktionen beschrieben.
Im Allgemeinen ist es am besten, mit der App zu beginnen und diese anschließend zum automatischen Generieren von Befehlszeilenskripten zu verwenden. Bevor Sie eine der beiden Methoden anwenden, definieren Sie zunächst das Problem, indem Sie einen Datensatz auswählen. Jede der Apps zur Entwicklung neuronaler Netze hat Zugang zu zahlreichen Beispieldatensätzen, die Sie zum Experimentieren mit der Toolbox verwenden können (siehe Beispieldatensätze für flache neuronale Netze). Wenn Sie ein bestimmtes Problem lösen möchten, können Sie auch Ihre eigenen Daten in den Arbeitsbereich laden. Das Datenformat ist im nächsten Abschnitt beschrieben.
Hinweis
Zum interaktiven Erstellen, Visualisieren und Trainieren neuronaler Deep-Learning-Netze verwenden Sie die App Deep Network Designer. Weitere Informationen finden Sie unter Erste Schritte mit Deep Network Designer.
Definieren eines Problems
Zur Definition eines Mustererkennungsproblems ordnen Sie eine Menge an Eingangsvektoren (Prädiktoren) als Spalten in einer Matrix an. Ordnen Sie anschließend eine weitere Menge an Antwortvektoren an, die die Klassen angeben, denen die Beobachtungen zugewiesen sind.
Wenn es nur zwei Klassen gibt, hat jede Antwort zwei Elemente, 0 und 1. Diese geben an, zu welcher Klasse die entsprechende Beobachtung gehört. Beispielsweise können Sie ein Klassifizierungsproblem mit zwei Klassen wie folgt definieren:
predictors = [7 10 3 1 6; 5 8 1 1 6; 6 7 1 1 6]; responses = [0 0 1 1 0; 1 1 0 0 1];
Wenn Prädiktoren in N verschiedene Klassen klassifiziert werden sollen, weisen die Antworten N Elemente auf. Für jede Antwort ist ein Element 1 und die anderen sind 0. Die folgenden Zeilen veranschaulichen beispielsweise, wie ein Klassifizierungsproblem definiert wird, das die Ecken eines 5x5x5-Würfels in drei Klassen unterteilt:
Der Ursprung (erster Eingangsvektor) wird einer Klasse zugeordnet
Die vom Ursprung am weitesten entfernte Ecke (letzter Eingangsvektor) wird einer zweiten Klasse zugeordnet
Alle anderen Punkte werden einer dritten Klasse zugeordnet
predictors = [0 0 0 0 5 5 5 5; 0 0 5 5 0 0 5 5; 0 5 0 5 0 5 0 5]; responses = [1 0 0 0 0 0 0 0; 0 1 1 1 1 1 1 0; 0 0 0 0 0 0 0 1];
Der nächste Abschnitt zeigt, wie ein Netz mithilfe der App Neural Net Pattern Recognition für die Mustererkennung trainiert wird. In diesem Beispiel wird ein Beispieldatensatz verwendet, der mit der Toolbox bereitgestellt wird.
Mustererkennung mit der App „Neural Net Pattern Recognition“
Dieses Beispiel veranschaulicht, wie ein flaches neuronales Netz mithilfe der App Neural Net Pattern Recognition zur Klassifizierung von Mustern trainiert werden kann.
Öffnen Sie die App Neural Net Pattern Recognition mithilfe des Befehls nprtool
.
nprtool
Auswählen der Daten
Die App Neural Net Pattern Recognition enthält Beispieldaten, die Ihnen den Einstieg in das Training eines neuronalen Netzes erleichtern.
Wählen Sie zum Importieren von Daten zur Klassifizierung von Glas die Optionen Import > Import Glass Data Set (Glasdatensatz importieren) aus. Mit diesem Datensatz können Sie ein neuronales Netz trainieren, das anhand der chemischen Eigenschaften von Glas klassifiziert, ob es sich um Fenster oder Nicht-Fenster handelt. Wenn Sie Ihre eigenen Daten aus einer Datei oder aus dem Arbeitsbereich importieren, müssen Sie die Prädiktoren und Antworten angeben und festlegen, ob die Beobachtungen in Zeilen oder Spalten vorliegen.
Informationen über die importierten Daten werden im Fenster Model Summary (Modellzusammenfassung) angezeigt. Dieser Datensatz enthält 214 Beobachtungen mit jeweils 9 Merkmalen. Jede Beobachtung wird in eine von zwei Klassen klassifiziert: Fenster oder Nicht-Fenster.
Unterteilen Sie die Daten in Trainings-, Validierungs- und Testmengen. Behalten Sie die Standardeinstellungen bei. Die Daten sind wie folgt unterteilt:
70 % für das Training.
15 % für die Validierung, um festzustellen, ob das Netz generalisiert, und um das Training zu stoppen, bevor es zu einer Überanpassung kommt.
15 %, um unabhängig zu testen, ob das Netz generalisiert.
Weitere Informationen zur Datenunterteilung finden Sie unter Divide Data for Optimal Neural Network Training.
Erstellen des Netzes
Das Netz ist ein zweischichtiges vorwärtsgerichtetes Netz (auch: Feedforward-Netz) mit einer Sigmoid-Transferfunktion in der verborgenen Schicht und einer Softmax-Transferfunktion in der Ausgangsschicht. Die Größe der verborgenen Schicht entspricht der Anzahl der verborgenen Neuronen. Die Standardschichtgröße ist 10
. Die Netzarchitektur wird im Fensterbereich Network angezeigt. Die Anzahl der Ausgangsneuronen ist auf 2 festgelegt, was der Anzahl der Klassen entspricht, die durch die Antwortdaten vorgegeben sind.
Trainieren des Netzes
Klicken Sie zum Trainieren des Netzes auf Train.
Im Fensterbereich Training wird der Trainingsfortschritt angezeigt. Das Training wird so lange fortgesetzt, bis eines der Stoppkriterien erfüllt ist. In diesem Beispiel wird das Training fortgesetzt, bis der Validierungsfehler sechs Iterationen lang kontinuierlich ansteigt („Validierungskriterium erfüllt“).
Analysieren der Ergebnisse
Die Modellzusammenfassung enthält Informationen zum Trainingsalgorithmus und zu den Trainingsergebnissen für die einzelnen Datensätze.
Sie können die Ergebnisse weiter analysieren, indem Sie Diagramme generieren. Zum Darstellen der Konfusionsmatrizen klicken Sie im Abschnitt Plots (Diagramme) auf Confusion Matrix (Konfusionsmatrix). Die Netzausgänge sind sehr genau, wie Sie an der hohen Anzahl korrekter Klassifizierungen in den grünen Quadraten (diagonal) und der geringen Anzahl falscher Klassifizierungen in den roten Quadraten (außerdiagonal) erkennen können.
Anhand der ROC-Kurve können Sie die Leistung des Netzes zusätzlich überprüfen. Klicken Sie im Abschnitt Plots (Diagramme) auf ROC Curve (ROC-Kurve).
Die farbigen Linien entlang der jeweiligen Achsen stellen die Receiver-Operating-Characteristics(ROC)-Kurven dar. Die ROC-Kurve ist ein Diagramm der Richtig-Positiv-Rate (Sensitivität) im Verhältnis zu der Falsch-Positiv-Rate (1-Spezifität), wenn der Schwellenwert variiert wird. Bei einem perfekten Test würden Punkte in der oberen linken Ecke mit einer Sensitivität von 100 % und einer Spezifität von 100 % angezeigt werden. Für dieses Problem funktioniert das Netz sehr gut.
Wenn Sie mit der Leistung des Netzes nicht zufrieden sind, können Sie eine der folgenden Möglichkeiten nutzen:
Trainieren Sie das Netz neu.
Erhöhen Sie die Anzahl der verborgenen Neuronen.
Verwenden Sie einen größeren Trainingsdatensatz.
Wenn die Trainingsmenge zu einer guten Leistung führt, die Testmenge jedoch nicht, könnte dies auf eine Überanpassung des Modells hinweisen. Durch eine Verringerung der Anzahl der Neuronen kann die Überanpassung reduziert werden.
Sie können die Leistung des Netzes auch anhand einer zusätzlichen Testmenge beurteilen. Um zusätzliche Testdaten zur Beurteilung des Netzes zu laden, klicken Sie im Abschnitt Test auf Test. In der Modellzusammenfassung werden die zusätzlichen Testergebnisse angezeigt. Sie können auch Diagramme generieren, um die zusätzlichen Testergebnisse zu analysieren.
Generieren von Code
Wählen Sie Generate Code > Generate Simple Training Script (Einfaches Trainingsskript generieren) aus, um MATLAB-Programmcode zu erstellen, mit dem die vorherigen Schritte über die Befehlszeile reproduziert werden können. Das Erstellen von MATLAB-Programmcode kann hilfreich sein, wenn Sie lernen möchten, wie die Befehlszeilenfunktionen der Toolbox zum Anpassen des Trainingsprozesses genutzt werden können. In Mustererkennung mithilfe von Befehlszeilenfunktionen werden Sie die generierten Skripte näher untersuchen.
Exportieren des Netzes
Sie können Ihr trainiertes Netz in den Arbeitsbereich oder nach Simulink® exportieren. Sie können das Netz auch mit MATLAB Compiler™ und anderen MATLAB-Tools zur Codegenerierung bereitstellen. Wählen Sie zum Exportieren Ihres trainierten Netzes und der Ergebnisse die Optionen Export Model > Export to Workspace (In den Arbeitsbereich exportieren) aus.
Mustererkennung mithilfe von Befehlszeilenfunktionen
Die einfachste Möglichkeit, den Umgang mit den Befehlszeilenfunktionen der Toolbox zu erlernen, besteht darin, mithilfe der Apps Skripte zu generieren und diese anschließend abzuändern, um das Netztraining individuell anzupassen. Sehen Sie sich als Beispiel das einfache Skript an, das im vorherigen Abschnitt mithilfe der App Neural Net Pattern Recognition erstellt wurde.
% Solve a Pattern Recognition Problem with a Neural Network % Script generated by Neural Pattern Recognition app % Created 22-Mar-2021 16:50:20 % % This script assumes these variables are defined: % % glassInputs - input data. % glassTargets - target data. x = glassInputs; t = glassTargets; % Choose a Training Function % For a list of all training functions type: help nntrain % 'trainlm' is usually fastest. % 'trainbr' takes longer but may be better for challenging problems. % 'trainscg' uses less memory. Suitable in low memory situations. trainFcn = 'trainscg'; % Scaled conjugate gradient backpropagation. % Create a Pattern Recognition Network hiddenLayerSize = 10; net = patternnet(hiddenLayerSize, trainFcn); % Setup Division of Data for Training, Validation, Testing net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100; % Train the Network [net,tr] = train(net,x,t); % Test the Network y = net(x); e = gsubtract(t,y); performance = perform(net,t,y) tind = vec2ind(t); yind = vec2ind(y); percentErrors = sum(tind ~= yind)/numel(tind); % View the Network view(net) % Plots % Uncomment these lines to enable various plots. %figure, plotperform(tr) %figure, plottrainstate(tr) %figure, ploterrhist(e) %figure, plotconfusion(t,y) %figure, plotroc(t,y)
Sie können das Skript speichern und es anschließend über die Befehlszeile ausführen, um die Ergebnisse der vorherigen Trainingssitzung zu reproduzieren. Außerdem können Sie das Skript bearbeiten, um den Trainingsprozess individuell anzupassen. In diesem Fall befolgen Sie die einzelnen Schritte im Skript.
Auswählen der Daten
Im Skript wird davon ausgegangen, dass Prädiktor- und Antwortvektoren bereits in den Arbeitsbereich geladen wurden. Wenn die Daten noch nicht geladen wurden, können Sie sie wie folgt laden:
load glass_dataset
glassInputs
und die Antworten glassTargets
in den Arbeitsbereich geladen.Bei diesem Datensatz handelt es sich um einen der Beispieldatensätze, die Teil der Toolbox sind. Informationen zu den verfügbaren Datensätzen finden Sie unter Beispieldatensätze für flache neuronale Netze. Zum Aufrufen einer Liste mit allen verfügbaren Datensätzen geben Sie den Befehl help nndatasets
ein. Sie können die Variablen aus jedem dieser Datensätze laden und dabei Ihre eigenen Variablennamen verwenden. Beispielsweise werden mit dem Befehl
[x,t] = glass_dataset;
x
und die Glas-Antworten in das Array t
geladen.Auswählen des Trainingsalgorithmus
Definieren Sie den Trainingsalgorithmus.
trainFcn = 'trainscg'; % Scaled conjugate gradient backpropagation.
Erstellen des Netzes
Erstellen Sie das Netz. Das Standardnetz für Mustererkennungsprobleme (Klassifizierungsprobleme), patternnet
, ist ein Feedforward-Netz mit der Standard-Sigmoid-Transferfunktion in der verborgenen Schicht und einer Softmax-Transferfunktion in der Ausgangsschicht. Das Netz weist eine einzelne verborgene Schicht mit zehn Neuronen (Standard) auf.
Das Netz hat zwei Ausgangsneuronen, da jedem Eingangsvektor zwei Antwortwerte (Klassen) zugeordnet sind. Jedes Ausgangsneuron stellt eine Klasse dar. Wenn ein Eingangsvektor der entsprechenden Klasse auf das Netz angewendet wird, sollte das entsprechende Neuron eine 1 generieren, und die anderen Neuronen sollten eine 0 ausgeben.
hiddenLayerSize = 10; net = patternnet(hiddenLayerSize, trainFcn);
Hinweis
Mehr Neuronen erfordern mehr Berechnungen und es kann tendenziell zu einer Überanpassung der Daten kommen, wenn die Zahl zu hoch festgelegt wurde. Doch das Netz kann auf diese Weise auch komplexere Probleme lösen. Mehr Schichten erfordern mehr Berechnungen, aber ihre Verwendung kann dazu führen, dass das Netz komplexe Probleme effizienter löst. Um mehr als eine verborgene Schicht zu verwenden, geben Sie die Größen der verborgenen Schichten als Elemente eines Arrays im Befehl patternnet
ein.
Unterteilen der Daten
Legen Sie die Unterteilung der Daten fest.
net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100;
Mit diesen Einstellungen werden die Prädiktor- und Antwortvektoren nach dem Zufallsprinzip unterteilt, wobei 70 % für das Training, 15 % für die Validierung und 15 % für das Testen verwendet werden. Weitere Informationen zum Datenunterteilungsprozess finden Sie unter Divide Data for Optimal Neural Network Training.
Trainieren des Netzes
Trainieren Sie das Netz.
[net,tr] = train(net,x,t);
Während des Trainings wird das Fenster mit dem Trainingsfortschritt geöffnet. Sie können das Training jederzeit unterbrechen, indem Sie auf die Stopp-Schaltfläche klicken.
Das Training wurde abgeschlossen, als der Validierungsfehler sechs Iterationen lang kontinuierlich anstieg, was bei Iteration 14 der Fall war.
Wenn Sie im Trainingsfenster auf Performance (Leistung) klicken, wird ein Diagramm der Trainingsfehler, Validierungsfehler und Testfehler angezeigt (siehe die folgende Abbildung).
In diesem Beispiel ist das Ergebnis angemessen, da der endgültige Kreuzentropiefehler gering ist.
Testen des Netzes
Testen Sie das Netz. Nachdem das Netz trainiert wurde, können Sie es zur Berechnung der Netzausgänge verwenden. Mit dem folgenden Code werden Netzausgänge, Fehler und Gesamtleistung berechnet.
y = net(x); e = gsubtract(t,y); performance = perform(net,t,y)
performance = 0.0659
Sie können auch den Anteil der fehlklassifizierten Beobachtungen berechnen. In diesem Beispiel weist das Modell eine sehr niedrige Fehlklassifizierungsrate auf.
tind = vec2ind(t); yind = vec2ind(y); percentErrors = sum(tind ~= yind)/numel(tind)
percentErrors = 0.0514
Sie können die Leistung des Netzes auch ausschließlich anhand der Testmenge berechnen, indem Sie die Testindizes verwenden, die sich im Trainingsdatensatz befinden.
tInd = tr.testInd; tstOutputs = net(x(:,tInd)); tstPerform = perform(net,t(tInd),tstOutputs)
tstPerform = 2.0163
Anzeigen des Netzes
Sehen Sie sich das Netzdiagramm an.
view(net)
Analysieren der Ergebnisse
Verwenden Sie die Funktion plotconfusion
, um die Konfusionsmatrix darzustellen. Sie können die Konfusionsmatrix auch für die einzelnen Datensätze darstellen, indem Sie im Trainingsfenster auf Confusion klicken.
figure, plotconfusion(t,y)
Die diagonalen grünen Zellen entsprechen der Anzahl der korrekt klassifizierten Fälle, die außerdiagonalen roten Zellen entsprechen den fehlklassifizierten Fällen. Die Ergebnisse weisen auf eine sehr gute Erkennung hin. Wenn Sie noch genauere Ergebnisse benötigen, können Sie einen der folgenden Ansätze ausprobieren:
Setzen Sie die ursprünglichen Netzgewichtungen und -verzerrungen mithilfe von
init
auf neue Werte und versuchen Sie es erneut.Erhöhen Sie die Anzahl der verborgenen Neuronen.
Verwenden Sie einen größeren Trainingsdatensatz.
Erhöhen Sie die Anzahl der Eingangswerte, wenn relevantere Daten verfügbar sind.
Probieren Sie einen anderen Trainingsalgorithmus aus (siehe Training Algorithms).
In diesem Fall sind die Netzergebnisse zufriedenstellend und Sie können das Netz jetzt auf neue Eingangsdaten anwenden.
Weitere Schritte
Wenn Sie mehr Erfahrung mit Befehlszeilenoperationen sammeln möchten, können Sie die folgenden Aufgaben ausprobieren:
Öffnen Sie während des Trainings ein Diagrammfenster (z. B. das Konfusionsdiagramm) und beobachten Sie seine Entwicklung.
Erstellen Sie ein Diagramm über die Befehlszeile mit Funktionen wie
plotroc
undplottrainstate
.
Beim Trainieren eines neuronalen Netzes kann sich jedes Mal eine andere Lösung ergeben, da die anfänglichen Gewichtungs- und Verzerrungswerte zufällig sind und die Daten unterschiedlich in Trainings-, Validierungs- und Testmengen unterteilt werden. Daher können verschiedene neuronale Netze, die für das gleiche Problem trainiert wurden, mit ein und demselben Eingang zu unterschiedlichen Ergebnissen führen. Um sicherzustellen, dass ein neuronales Netz mit guter Genauigkeit gefunden wurde, müssen Sie das Netz mehrmals neu trainieren.
Es gibt verschiedene weitere Techniken zur Verbesserung der ursprünglichen Lösungen, wenn eine höhere Genauigkeit erwünscht ist. Weitere Informationen finden Sie unter Improve Shallow Neural Network Generalization and Avoid Overfitting.
Siehe auch
Neural Net Fitting | Neural Net Time Series | Neural Net Pattern Recognition | Neural Net Clustering | Deep Network Designer | trainscg