2017-08-05 2 views
1

Ich arbeite an Gesichtsausdruckerkennung, und ich benutze Keras. Ich habe viele Datensätze gesammelt, und dann habe ich die Datenerweiterung auf die Bilder angewendet. Ich habe etwa 500 000 Bilder (als Pixel) in einer .csv-Datei gespeichert (dasselbe Format wie fer2013.csv).Keras Umgang mit großen Datenmengen, die nicht in den Speicher passen

Dies ist der Code Ich verwende:

def Zerocenter_ZCA_whitening_Global_Contrast_Normalize(list): 
    Intonumpyarray = numpy.asarray(list) 
    data = Intonumpyarray.reshape(img_width,img_height) 
    data2 = ZeroCenter(data) 
    data3 = zca_whitening(flatten_matrix(data2)).reshape(img_width,img_height) 
    data4 = global_contrast_normalize(data3) 
    data5 = numpy.rot90(data4,3) 
    return data5 



def load_data(): 
    train_x = [] 
    train_y = [] 
    val_x = [] 
    val_y = [] 
    test_x = [] 
    test_y = [] 

    f = open('ALL.csv') 
    csv_f = csv.reader(f) 

    for row in csv_f: 
     if str(row[2]) == "Training": 
      temp_list_train = [] 

      for pixel in row[1].split(): 
       temp_list_train.append(int(pixel)) 

      data = Zerocenter_ZCA_whitening_Global_Contrast_Normalize(temp_list_train) 
      train_y.append(int(row[0])) 
      train_x.append(data.reshape(data_resh).tolist()) 

     elif str(row[2]) == "PublicTest": 
      temp_list_validation = [] 

      for pixel in row[1].split(): 
       temp_list_validation.append(int(pixel)) 

      data = Zerocenter_ZCA_whitening_Global_Contrast_Normalize(temp_list_validation) 
      val_y.append(int(row[0])) 
      val_x.append(data.reshape(data_resh).tolist()) 

     elif str(row[2]) == "PrivateTest": 
      temp_list_test = [] 

      for pixel in row[1].split(): 
       temp_list_test.append(int(pixel)) 

      data = Zerocenter_ZCA_whitening_Global_Contrast_Normalize(temp_list_test) 
      test_y.append(int(row[0])) 
      test_x.append(data.reshape(data_resh).tolist()) 

    return train_x, train_y, val_x, val_y, test_x, test_y 

Und dann Daten, die ich laden und füttern sie mit dem Generator:

Train_x, Train_y, Val_x, Val_y, Test_x, Test_y = load_data() 

Train_x = numpy.asarray(Train_x) 
Train_x = Train_x.reshape(Train_x.shape[0],img_rows,img_cols) 

Test_x = numpy.asarray(Test_x) 
Test_x = Test_x.reshape(Test_x.shape[0],img_rows,img_cols) 

Val_x = numpy.asarray(Val_x) 
Val_x = Val_x.reshape(Val_x.shape[0],img_rows,img_cols) 

Train_x = Train_x.reshape(Train_x.shape[0], img_rows, img_cols, 1) 
Test_x = Test_x.reshape(Test_x.shape[0], img_rows, img_cols, 1) 
Val_x = Val_x.reshape(Val_x.shape[0], img_rows, img_cols, 1) 

Train_x = Train_x.astype('float32') 
Test_x = Test_x.astype('float32') 
Val_x = Val_x.astype('float32') 

Train_y = np_utils.to_categorical(Train_y, nb_classes) 
Test_y = np_utils.to_categorical(Test_y, nb_classes) 
Val_y = np_utils.to_categorical(Val_y, nb_classes) 


datagen = ImageDataGenerator(
    featurewise_center=False, 
    samplewise_center=False, 
    featurewise_std_normalization=False, 
    samplewise_std_normalization=False, 
    zca_whitening=False, 
    width_shift_range=0.2, 
    height_shift_range=0.2, 
    horizontal_flip=True, 
    shear_range=0.03, 
    zoom_range=0.03, 
    vertical_flip=False) 

datagen.fit(Train_x) 

model.fit_generator(datagen.flow(Train_x, Train_y, 
    batch_size=batch_size), 
    samples_per_epoch=Train_x.shape[0], 
    nb_epoch=nb_epoch, 
    validation_data=(Val_x, Val_y)) 

Wenn ich den Code ausführen, RAM-Auslastung größer wird und größer, bis der PC einfriert (ich habe 16 GB). Es bleibt hängen, wenn loading_data() aufgerufen wird. Gibt es eine Lösung für dieses Problem, die zu meinem Code passt?

+0

Sie müssen eine Generatorfunktion schreiben, die eine bestimmte Anzahl von Zeilen Ihrer csv-Datei zu einem Zeitpunkt in Ram lädt (ein gutes Beispiel) (https://github.com/fchollet/keras/issues/2708). Sie laden zu viele Daten auf einmal – DJK

Antwort

1

Scheint ein Duplikat von this question zu sein. Grundsätzlich müssen Sie fit_generator() anstelle von fit() verwenden und eine Funktion übergeben, die die Daten in einem Modell statt einzeln auf einmal in Ihr Modell lädt.

Verwandte Themen