2017-02-05 23 views
3

Я запускаю несколько вложенных циклов, чтобы выполнить поиск сетки гиперпараметров. Каждый вложенный цикл проходит через список значений гиперпараметров и внутри самого внутреннего цикла, последовательная модель Keras строится и оценивается каждый раз с использованием генератора. (Я не тренируюсь, я просто случайно инициализирую, а затем несколько раз оцениваю модель, а затем получаю среднюю потерю).Keras: Недостаточно памяти при выполнении поиска сетки гиперпараметров

Моя проблема заключается в том, что во время этого процесса Keras, похоже, заполняет мою память GPU, так что в итоге я получаю ошибку OOM.

Кто-нибудь знает, как решить эту проблему и освободить память GPU каждый раз после оценки модели?

Мне больше не нужна модель после того, как она была оценена, я могу полностью ее отбросить, прежде чем строить новую в следующем проходе внутреннего цикла.

Я использую бэкэнс Tensorflow.

Вот код, хотя большая часть его не имеет отношения к общей проблеме. Модель построена в четвертом цикле,

for fsize in fsizes: 

Я думаю, подробности того, как построена модель не имеет большого значения, но здесь все это так или иначе:

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() 
+1

Используете ли вы тензорный поток или anano-бэкэнд? – indraforyou

+0

@indraforyou Я использую бэкэнс Tensorflow, извините за то, что не упоминал об этом! – Alex

ответ

4

Как указано, backend, используемый в Tensorflow. В Tensorflow backend текущая модель не разрушена. Поэтому вам нужно очистить сеанс.

После использования модели просто поставить:

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

Включите бэкенд:

from keras import backend as K 

Также вы можете использовать sklearn обертку, чтобы сделать поиск сетки. Проверьте этот пример: here. Также для более продвинутого поиска гиперпараметра вы можете использовать hyperas.

+1

Удивительно! Большое спасибо, это именно то, что мне нужно было понять. И большое спасибо за то, что я указал на гиперопт/гиперас! – Alex

+0

Как очистить сеанс в sklearn gridsearchcv? – curio1729

+0

Я думал, что «keras.wrappers.scikit_learn.KerasClassifier» позаботился об этом. Я не сталкивался с проблемами, связанными с данным примером. Если вы столкнулись с проблемой, отправьте вопрос в Keras github. – indraforyou