Angenommen, Sie haben einen Datensatz mit Bildern und einigen Daten in einem .csv
für jedes Bild. Ihr Ziel ist es, eine NN mit einem Faltungszweig und einem anderen (in meinem Fall einem MLP) zu erstellen.
Nun gibt es viele Anleitungen ( eine hier , eine andere ) zum Erstellen des Netzwerks, das ist nicht das Problem.
Das Problem hier ist , wie kann ich einen Iterator in Form erstellen , [[convolution_input, other_features], target]
wenn die convolution_input
aus einem Keras fließen , dass Augmented Bilder hinzufügt.ImageDataGenerator
Genauer gesagt, wenn das n-te Bild (das ein erweitertes sein kann oder nicht) dem NN zugeführt wird, möchte ich, dass seine ursprünglichen Merkmale darin enthalten sind other_features
.
Ich fand nur wenige Versuche ( hier und hier sah der zweite vielversprechend aus, aber ich konnte nicht herausfinden, wie man mit erweiterten Bildern umgeht), um genau das zu tun, aber sie scheinen die mögliche Manipulation des Datensatzes durch den Keras-Generator nicht zu berücksichtigen tut.
quelle
flow
oder brauchst duflow_from_directory
? (flow
bedeutet, dass Sie alle Bilder im Speicher behalten können)flow_from_dataframe
da ich Dateinamen, Funktionen und Klassen habeAntworten:
Angenommen, Sie haben eine CSV-Datei, sodass sich Ihre Bilder und die anderen Funktionen in der Datei befinden.
Dabei steht id für den Bildnamen, gefolgt von den Features und Ihrem Ziel (Klasse für die Klassifizierung, Nummer für die Regression).
Definieren wir zuerst einen Datengenerator und später können wir ihn überschreiben.
Lassen Sie uns die Daten aus dem CSV in einem Pandas-Datenrahmen lesen und den Flow_from_Dataframe von Keras verwenden, um aus dem Datenrahmen zu lesen.
Sie können Ihre Erweiterung jederzeit in ImageDataGenerator hinzufügen.
Dinge, die im obigen Code in flow_from_dataframe zu beachten sind, sind
x_col = der Bildname
y_col = normalerweise Spalten mit dem Klassennamen, aber lassen Sie uns diesen später überschreiben, indem Sie zuerst alle anderen Spalten in der CSV bereitstellen. dh feat_1, feat_2 .... bis class_label
class_mode = raw, schlagen Sie dem Generator vor, alle Werte in y unverändert zurückzugeben.
Lassen Sie uns nun den obigen Generator überschreiben / erben und einen neuen erstellen, so dass er [img, otherfeatures], [target] zurückgibt.
Hier ist der Code mit Kommentaren als Erklärungen
Erstellen Sie eine ähnliche Funktion für Ihren Validierungsgenerator. Verwenden Sie train_test_split, um Ihren Datenrahmen bei Bedarf aufzuteilen, 2 Generatoren zu erstellen und diese zu überschreiben.
Übergeben Sie die Funktion in model.fit_generator wie folgt
quelle
if(count==len(df.index))
man die Epoche verfolgen, wenn der erweiterte Datensatz weitaus zahlreicher ist als der ursprüngliche?