CNN-Architekturen für die Regression?


32

Ich habe an einem Regressionsproblem gearbeitet, bei dem die Eingabe ein Bild und die Bezeichnung ein kontinuierlicher Wert zwischen 80 und 350 ist. Bei den Bildern handelt es sich um einige Chemikalien, nachdem eine Reaktion stattgefunden hat. Die Farbe, die angezeigt wird, gibt die Konzentration einer anderen Chemikalie an, die übrig bleibt, und das ist, was das Modell ausgeben soll - die Konzentration dieser Chemikalie. Die Bilder können gedreht, gespiegelt und gespiegelt werden, und die erwartete Ausgabe sollte immer noch dieselbe sein. Diese Art der Analyse wird in realen Labors durchgeführt (sehr spezialisierte Maschinen geben die Konzentration der Chemikalien mithilfe der Farbanalyse aus, genau wie ich dieses Modell trainiere).

Bisher habe ich nur mit Modellen experimentiert, die grob auf VGG basieren (mehrere Sequenzen von Conv-Conv-Conv-Pool-Blöcken). Bevor ich mit neueren Architekturen (Inception, ResNets usw.) experimentierte, dachte ich, ich würde nachforschen, ob es andere Architekturen gibt, die häufiger für die Regression mithilfe von Bildern verwendet werden.

Der Datensatz sieht folgendermaßen aus:

Bildbeschreibung hier eingeben

Der Datensatz enthält ungefähr 5.000 250x250 Samples, die ich auf 64x64 skaliert habe, um das Training zu vereinfachen. Sobald ich eine vielversprechende Architektur gefunden habe, experimentiere ich mit Bildern mit größerer Auflösung.

Bisher haben meine besten Modelle einen mittleren Fehlerquadrat für Trainings- und Validierungssätze von etwa 0,3, was in meinem Anwendungsfall alles andere als akzeptabel ist.

Mein bisher bestes Modell sieht so aus:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

Frage

Was ist eine geeignete Architektur für die Regressionsausgabe aus einer Bildeingabe?

Bearbeiten

Ich habe meine Erklärung umformuliert und Erwähnungen der Genauigkeit entfernt.

Bearbeiten 2

Ich habe meine Frage so umstrukturiert, dass hoffentlich klar ist, wonach ich suche


4
Genauigkeit ist keine Maßnahme, die direkt auf Regressionsprobleme angewendet werden kann. Was meinen Sie mit einer Genauigkeit von 30%? Genauigkeit bezieht sich wirklich nur auf Klassifizierungsaufgaben, nicht auf Regression.
Nuclear Wang

1
Was meinst du mit "sagt 30% der Zeit richtig voraus" ? Machst du wirklich Regression?
Firebug

1
Warum nennt man dieses Problem Regression? Versuchen Sie nicht, in Labels zu klassifizieren? sind die Bezeichnungen Kardinal?
Aksakal

2
Ich möchte nicht genau dasselbe wie vgg. Ich mache etwas VGG-ähnliches, dh eine Reihe von Convs, gefolgt von maximalem Pooling, gefolgt von vollständig verbunden. Scheint ein generischer Ansatz für die Arbeit mit Bildern zu sein. Aber genau darum geht es in meiner ursprünglichen Frage. Scheint, als ob all diese Kommentare, obwohl sie für mich aufschlussreich sind, den Sinn dessen, was ich zuerst verlange, völlig verfehlen.
Rodrigo-Silveira

1
y[80,350]θy

Antworten:


42

Zunächst ein allgemeiner Vorschlag: Führen Sie eine Literaturrecherche durch, bevor Sie Experimente zu einem Thema durchführen, mit dem Sie nicht vertraut sind. Sie sparen sich viel Zeit.

In diesem Fall haben Sie bei der Betrachtung vorhandener Papiere möglicherweise bemerkt, dass

  1. CNNs wurden mehrfach für die Regression verwendet: Dies ist ein Klassiker, aber er ist alt (ja, in DL sind 3 Jahre alt). Ein moderneres Papier hätte AlexNet für diese Aufgabe nicht verwendet. Dies ist neueren Datums, aber es handelt sich um ein weitaus komplizierteres Problem (3D-Rotation), mit dem ich sowieso nicht vertraut bin.
  2. Die Regression mit CNNs ist kein triviales Problem. Wenn Sie sich das erste Papier noch einmal ansehen, werden Sie feststellen, dass es ein Problem gibt, bei dem im Grunde unbegrenzte Daten generiert werden können. Ihr Ziel ist es, den Drehwinkel vorherzusagen, der zum Korrigieren von 2D-Bildern erforderlich ist. Das bedeutet, dass ich mein Trainingsset im Grunde genommen durch Drehen jedes Bildes um beliebige Winkel erweitern und ein gültiges, größeres Trainingsset erhalten kann. Daher scheint das Problem relativ einfach zu sein, was Deep-Learning-Probleme angeht. Übrigens, beachten Sie auch die anderen von ihnen verwendeten Tricks zur Datenerweiterung:

    Wir verwenden Translationen (bis zu 5% der Bildbreite), Helligkeitsanpassung im Bereich [–0,2, 0,2], Gammaanpassung mit γ ∈ [–0,5, 0,1] und Gaußsches Pixelrauschen mit einer Standardabweichung im Bereich [0] 0,02].

    k

    yxα=atan2(y,x)>11%des maximal möglichen Fehlers. Sie schnitten etwas besser ab, wenn zwei Netzwerke hintereinander verwendet wurden: Das erste führte eine Klassifizierung durch (sagen Sie voraus, ob der Winkel oder ), dann würde das um den vom ersten Netzwerk vorhergesagten Betrag gedrehte Bild einem anderen neuronalen Netzwerk zugeführt (diesmal zur Regression), das die endgültige zusätzliche Drehung in vorhersagen würde der Bereich.[180°,90°],[90°,0°],[0°,90°][90°,180°][45°,45°]

    Bei einem viel einfacheren (gedrehten MNIST-) Problem können Sie etwas Besseres erzielen , aber Sie unterschreiten dennoch nicht einen RMSE-Fehler, der des maximal möglichen Fehlers beträgt.2.6%

Was können wir daraus lernen? Zuallererst sind diese 5000 Bilder ein kleiner Datensatz für Ihre Aufgabe. Die erste Arbeit verwendete ein Netzwerk, das auf Bildern aufgebaut war, die denen ähnelten, für die sie die Regressionsaufgabe lernen wollten: Sie müssen nicht nur eine andere Aufgabe lernen als die, für die die Architektur entworfen wurde (Klassifizierung), sondern Ihr Trainingsset funktioniert auch nicht Sieht überhaupt nicht so aus wie die Trainingssets, auf denen diese Netzwerke normalerweise trainiert werden (CIFAR-10/100 oder ImageNet). Sie werden also wahrscheinlich keinen Nutzen aus dem Transferlernen ziehen. Das MATLAB-Beispiel hatte 5000 Bilder, aber sie waren schwarz-weiß und semantisch alle sehr ähnlich (na ja, das könnte auch Ihr Fall sein).

Wie realistisch ist es dann besser als 0,3? Zunächst müssen wir verstehen, was Sie unter einem durchschnittlichen Verlust von 0,3 verstehen. Meinen Sie, dass der RMSE-Fehler 0,3 ist,

1Ni=1N(h(xi)yi)2

wobei die Größe Ihres Trainingssatzes ist (also ), die Ausgabe Ihres CNN für image und die entsprechende Konzentration der Chemikalie ist? Seit Sie weniger als Fehler , wenn Sie davon ausgehen, dass Sie die Prognosen Ihres CNN zwischen 80 und 350 (oder einfach ein Logit verwenden, um sie in dieses Intervall einzupassen) . Ernsthaft, was erwartest du? Es scheint mir überhaupt kein großer Fehler zu sein.NN<5000h(xi)xiyiyi[80,350]0.12%

Versuchen Sie auch einfach, die Anzahl der Parameter in Ihrem Netzwerk zu berechnen: Ich habe es eilig und mache möglicherweise dumme Fehler. Überprüfen Sie meine Berechnungen daher auf jeden Fall noch einmal mit einer summaryFunktion aus dem von Ihnen verwendeten Framework. Aber ungefähr würde ich sagen, dass Sie haben

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(Anmerkung: Ich habe die Parameter der Batch-Norm-Layer übersprungen, aber sie sind nur vier Parameter für Layer, damit sie keinen Unterschied machen.) Sie haben eine halbe Million Parameter und 5000 Beispiele ... was würden Sie erwarten? Sicher, die Anzahl der Parameter ist kein guter Indikator für die Kapazität eines neuronalen Netzwerks (es ist ein nicht identifizierbares Modell), aber dennoch ... Ich denke, Sie können nicht viel besser als dies tun, aber Sie können es versuchen wenige Sachen:

  • Normalisieren Sie alle Eingänge (skalieren Sie beispielsweise die RGB-Intensitäten jedes Pixels zwischen -1 und 1 oder verwenden Sie die Standardisierung) und alle Ausgänge. Dies ist besonders hilfreich, wenn Sie Konvergenzprobleme haben.
  • Gehen Sie zu Graustufen: Dies würde Ihre Eingangskanäle von 3 auf 1 reduzieren. Alle Ihre Bilder scheinen (für mein ungeschultes Auge) relativ ähnliche Farben zu haben. Sind Sie sicher, dass es die Farbe ist, die für die Vorhersage von benötigt wird , und nicht die Existenz von dunkleren oder helleren Bereichen? Vielleicht sind Sie sich sicher (ich bin kein Experte): Überspringen Sie in diesem Fall diesen Vorschlag.y
  • Daten Augmentation: da du das Umklappen sagte, um einen beliebigen Winkel drehen oder spiegeln Sie Ihre Bilder in der gleichen Ausgabe führen sollte, können Sie die Größe Ihrer Daten erhöhen setzen viel . Beachten Sie, dass bei einem größeren Datensatz der Fehler im Trainingssatz auftritt: Wir suchen hier nach einer kleineren Lücke zwischen dem Verlust des Trainingssatzes und dem Verlust des Testsatzes. Wenn der Verlust des Trainingssatzes stark zunimmt, könnte dies eine gute Nachricht sein: Es kann bedeuten, dass Sie ein tieferes Netzwerk für diesen größeren Trainingssatz trainieren können, ohne das Risiko einer Überanpassung. Versuchen Sie, weitere Ebenen hinzuzufügen, und prüfen Sie, ob Sie jetzt ein kleineres Trainingsset und einen Testsetverlust erhalten. Schließlich können Sie auch die anderen oben genannten Tricks zur Datenerweiterung ausprobieren, wenn sie im Kontext Ihrer Anwendung sinnvoll sind.
  • Verwenden Sie den Trick Klassifikation-dann-Regression: Ein erstes Netzwerk bestimmt nur, ob sich in einem von beispielsweise 10 Bins wie usw. befinden soll. Ein zweites Netzwerk berechnet dann eine -Korrektur: Zentrieren und Normalisieren können auch hier hilfreich sein. Kann ich nicht sagen, ohne es zu versuchen.y[80,97],[97,124][0,27]
  • Versuchen Sie, eine moderne Architektur (Inception oder ResNet) anstelle einer klassischen zu verwenden. ResNet hat eigentlich weniger Parameter als VGG-net. Natürlich möchten Sie hier die kleinen ResNets verwenden - ich glaube nicht, dass ResNet-101 bei einem 5000-Bilder-Datensatz helfen könnte. Sie können den Datensatz jedoch erheblich erweitern ....
  • Da Ihre Ausgabe rotationsunabhängig ist, empfiehlt es sich, entweder gruppenäquivariante CNNs zu verwenden , deren Ausgabe (bei Verwendung als Klassifizierer) nicht von diskreten Rotationen abhängt , oder steuerbare CNNsderen Ausgabe ist unveränderlich für kontinuierliche Rotationen. Die Invarianzeigenschaft würde es Ihnen ermöglichen, gute Ergebnisse mit viel weniger oder im Idealfall gar keinem Datenzuwachs zu erzielen (was Rotationen betrifft: Sie benötigen natürlich immer noch die anderen Arten von Daten). In Bezug auf die Implementierung sind gruppenäquivariante CNNs ausgereifter als steuerbare CNNs. Daher würde ich zuerst Gruppen-CNNs ausprobieren. Sie können die Klassifizierung-dann-Regression mit dem G-CNN für den Klassifizierungsteil ausprobieren oder mit dem reinen Regressionsansatz experimentieren. Denken Sie daran, die oberste Ebene entsprechend zu ändern.
  • experimentiere mit der Batchgröße (ja, ja, ich weiß, Hyperparameter-Hacking ist nicht cool, aber dies ist das Beste, was ich in einem begrenzten Zeitrahmen haben könnte & kostenlos :-)
  • Schließlich gibt es Architekturen, die speziell für genaue Vorhersagen mit kleinen Datenmengen entwickelt wurden. Die meisten von ihnen verwendeten erweiterte Windungen : Ein berühmtes Beispiel ist das dichte neuronale Faltungsnetz mit gemischten Maßstäben . Die Implementierung ist jedoch nicht trivial.

3
Vielen Dank für die ausführliche Antwort. Ich hatte bereits umfangreiche Datenerhöhungen durchgeführt. Versuchte ein paar Varianten des Anfangsmodells (wobei eine Variation bedeutet, dass die Anzahl der Filter über das gesamte Modell gleichmäßig skaliert wird). Sah unglaubliche Verbesserungen. Ich habe noch einen weiten Weg vor mir. Ich werde ein paar Ihrer Vorschläge versuchen. Danke noch einmal.
Rodrigo-Silveira

@ rodrigo-silveira gern geschehen, lass mich wissen, wie es geht. Vielleicht können wir uns im Chat unterhalten, sobald Sie Ergebnisse haben.
DeltaIV

1
Tolle Antwort, verdient mehr ^
Gilly

1
Sehr gut komponiert!
Karthik Thiagarajan

1
Ich würde Ihnen dafür 10.000 Punkte geben, wenn ich könnte. Erstaunlich Antwort
Boppity Bop
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.