Keras: Aus Speicher, wenn Hyperparameter-Raster suchen

Ich laufe mehrere verschachtelte Schleifen, um Hyper-Parameter-Raster-Suche zu tun. Jede verschachtelte Schleife führt durch eine Liste von Hyperparameterwerten und innerhalb der innersten Schleife wird ein Keras-sequentielles Modell jedes Mal mit einem Generator erstellt und ausgewertet. (Ich mache keine Ausbildung, ich bin nur zufällig Initialisierung und dann Auswertung des Modells mehrmals und dann Abrufen der durchschnittlichen Verlust).

Mein Problem ist, dass während dieses Prozesses Keras scheint, mein GPU-Speicher zu füllen, damit ich schließlich einen OOM-Fehler bekomme.

Weiß jemand, wie man das löst und den GPU-Speicher jedes Mal freigibt, nachdem ein Modell ausgewertet wurde?

Ich brauche das Modell nicht mehr, nachdem es ausgewertet worden ist, ich kann es jedes Mal ganz wegwerfen, bevor ich im nächsten Durchgang der inneren Schleife einen neuen baue.

Ich benutze das Tensorflow-Backend.

Hier ist der Code, obwohl vieles davon für das allgemeine Problem nicht relevant ist. Das Modell ist in der vierten Schleife gebaut,

for fsize in fsizes: 

Ich denke, die Details, wie das Modell gebaut wird, spielt keine Rolle, aber hier ist alles sowieso:

 model_losses = [] model_names = [] for activation in activations: for i in range(len(layer_structures)): for width in layer_widths[i]: for fsize in fsizes: model_name = "test_{}_struc-{}_width-{}_fsize-{}".format(activation,i,np.array_str(np.array(width)),fsize) model_names.append(model_name) print("Testing new model: ", model_name) #Structure for this network structure = layer_structures[i] row, col, ch = 80, 160, 3 # Input image format model = Sequential() model.add(Lambda(lambda x: x/127.5 - 1., input_shape=(row, col, ch), output_shape=(row, col, ch))) for j in range(len(structure)): if structure[j] == 'conv': model.add(Convolution2D(width[j], fsize, fsize)) model.add(BatchNormalization(axis=3, momentum=0.99)) if activation == 'relu': model.add(Activation('relu')) if activation == 'elu': model.add(ELU()) model.add(MaxPooling2D()) elif structure[j] == 'dense': if structure[j-1] == 'dense': model.add(Dense(width[j])) model.add(BatchNormalization(axis=1, momentum=0.99)) if activation == 'relu': model.add(Activation('relu')) elif activation == 'elu': model.add(ELU()) else: model.add(Flatten()) model.add(Dense(width[j])) model.add(BatchNormalization(axis=1, momentum=0.99)) if activation == 'relu': model.add(Activation('relu')) elif activation == 'elu': model.add(ELU()) model.add(Dense(1)) average_loss = 0 for k in range(5): model.compile(optimizer="adam", loss="mse") val_generator = generate_batch(X_val, y_val, resize=(160,80)) loss = model.evaluate_generator(val_generator, len(y_val)) average_loss += loss average_loss /= 5 model_losses.append(average_loss) print("Average loss after 5 initializations: {:.3f}".format(average_loss)) print() 

One Solution collect form web for “Keras: Aus Speicher, wenn Hyperparameter-Raster suchen”

Wie angegeben das in Tensorflow verwendete Backend. Im Tensorflow-Backend wird das aktuelle Modell nicht zerstört. Also musst du die session löschen

Nach dem Gebrauch des Modells setzen Sie einfach:

 if K.backend() == 'tensorflow': K.clear_session() 

Füge das Backend ein:

 from keras import backend as K 

Auch können Sie Sklearn-Wrapper verwenden, um Raster suchen. Überprüfe dieses Beispiel: hier Auch für fortgeschrittene Hyperparameter-Suche können Sie Hyperas verwenden .

Python ist die beste Programmiersprache der Welt.