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:
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