Я запускаю несколько вложенных циклов, чтобы выполнить поиск сетки гиперпараметров. Каждый вложенный цикл проходит через список значений гиперпараметров и внутри самого внутреннего цикла, последовательная модель 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()
Используете ли вы тензорный поток или anano-бэкэнд? – indraforyou
@indraforyou Я использую бэкэнс Tensorflow, извините за то, что не упоминал об этом! – Alex