Ich versuche mein Modell zu trainieren, das Bilder klassifiziert. Das Problem, das ich habe, ist, dass sie unterschiedliche Größen haben. Wie soll ich meine Bilder / oder Modellarchitektur formatieren?
Ich versuche mein Modell zu trainieren, das Bilder klassifiziert. Das Problem, das ich habe, ist, dass sie unterschiedliche Größen haben. Wie soll ich meine Bilder / oder Modellarchitektur formatieren?
Antworten:
Sie haben nicht gesagt, von welcher Architektur Sie sprechen. Da Sie sagten, Sie möchten Bilder klassifizieren, gehe ich davon aus, dass es sich um ein teilweise faltungsorientiertes, teilweise vollständig verbundenes Netzwerk wie AlexNet, GoogLeNet usw. handelt. Im Allgemeinen hängt die Antwort auf Ihre Frage vom Netzwerktyp ab, mit dem Sie arbeiten.
Wenn Ihr Netzwerk beispielsweise nur Faltungseinheiten enthält, dh keine vollständig verbundenen Schichten enthält, kann dies für die Größe des Eingabebilds unveränderlich sein. Ein solches Netzwerk könnte die Eingabebilder verarbeiten und wiederum ein anderes Bild zurückgeben ("Faltung den ganzen Weg"); Sie müssten sicherstellen, dass die Ausgabe Ihren Erwartungen entspricht, da Sie den Verlust natürlich auf irgendeine Weise bestimmen müssen.
Wenn Sie jedoch vollständig angeschlossene Einheiten verwenden, treten Probleme auf: Hier haben Sie eine feste Anzahl von gelernten Gewichten, mit denen Ihr Netzwerk arbeiten muss, sodass unterschiedliche Eingaben eine unterschiedliche Anzahl von Gewichten erfordern würden - und das ist nicht möglich.
Wenn dies Ihr Problem ist, können Sie Folgendes tun:
N
verschiedene Bilder mit der richtigen Größe aufgeteilt wird.Die Auffülloption führt möglicherweise eine zusätzliche Fehlerquelle in die Netzwerkvorhersage ein, da das Netzwerk möglicherweise (gelesen: wahrscheinlich) auf Bilder ausgerichtet ist, die einen solchen aufgefüllten Rand enthalten. Wenn Sie einige Ideen benötigen, schauen Sie sich den Abschnitt Bilder in der TensorFlow-Dokumentation an. Es gibt solche Teile resize_image_with_crop_or_pad
, die die größere Arbeit wegnehmen.
Was tut der Pflege einfach nicht über Quetschen, hier ist ein Stück der Vorverarbeitung Pipeline des berühmten Inception - Netzwerkes:
# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.
# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
distorted_image,
lambda x, method: tf.image.resize_images(x, [height, width], method=method),
num_cases=num_resize_cases)
Sie sind sich dessen total bewusst und tun es trotzdem.
Je nachdem , wie weit wollen Sie oder Notwendigkeit zu gehen, gibt es eigentlich ein Papier hier genannt Spatial Pyramide Pooling in Deep Convolution Networks für Visual Recognition , dass Griffe Eingänge von beliebiger Größe , indem sie auf eine ganz besondere Art und Weise zu verarbeiten.
Versuchen Sie, eine räumliche Pyramiden-Pooling-Ebene zu erstellen. Setzen Sie es dann nach Ihrer letzten Faltungsschicht, so dass die FC-Schichten immer konstante Dimensionsvektoren als Eingabe erhalten. Trainieren Sie während des Trainings die Bilder aus dem gesamten Datensatz mit einer bestimmten Bildgröße für eine Epoche. Wechseln Sie dann für die nächste Epoche zu einer anderen Bildgröße und setzen Sie das Training fort.