Main Content

Die Übersetzung dieser Seite ist veraltet. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

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:

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];
Die Daten bestehen aus fünf Beobachtungen mit jeweils drei Merkmalen, die für eine der zwei Klassen klassifiziert sind.

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];
Die Daten bestehen aus acht Beobachtungen mit jeweils drei Merkmalen, die für eine der drei Klassen klassifiziert sind.

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
Mit diesem Befehl werden die Prädiktoren 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;
die Glas-Prädiktoren in das Array 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.

Neural network training progress window

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).

Cross entropy error against number of epochs for the training, validation, and test data. The best validation performance is 0.058432 at epoch 8.

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)

Graphical representation of the pattern recognition network. The network has input size 9, output size 2, and a single hidden layer of size 10.

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)

Confusion matrix of the output and target classes. The network classifies 203 inputs correctly and 11 inputs incorrectly.

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 und plottrainstate.

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

| | | | |

Verwandte Themen