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.
df = pandas.read_csv("dummycsv.csv")
datagen = ImageDataGenerator(rescale=1/255.)
generator = datagen.flow_from_dataframe(df,directory="out/",x_col="id",y_col=df.columns[1:],class_mode="raw",batch_size=1)
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
def my_custom_generator():
count = 0 #to keep track of complete epoch
while True:
if(count==len(df.index)):
#if the count is matching with the length of df, the one pass is completed, so reset the generator
generator.reset()
break
count+=1
data = generator.next() #get the data from the generator
#the data looks like this [[img,img] , [other_cols,other_cols]] based on the batch size
imgs = []
cols = []
targets = []
#iterate the data and append the necessary columns in the corresponding arrays
for k in range(batch_size):
imgs.append(data[0][k]) #the first array contains all images
cols.append(data[1][k][:-1]) #the second array contains all features with last column as class, so [:-1]
targets.append(data[1][k][-1]) #the last column in the second array from data is the class
yield [imgs,cols],targets #this will yield the result as you expect.
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
model.fit_generator(my_custom_generator(),.....other params)
flow
oder brauchst duflow_from_directory
? (flow
bedeutet, dass Sie alle Bilder im Speicher behalten können)