Я пытаюсь обучить модель с тензорным потоком на машине с Ubuntu 16.4.Однако TF потребляет почти всю доступную оперативную память вскоре после начала обучения (8 ГБ) и уничтожается жнецом OOM.Если я отключаю OOM killer, он завершается с ошибкой сегментации.
Мой поиск пока не дал ничего, что указывало бы на то, что вы можете ограничить объем использования тензорного потока ОЗУ, настраиваются только параметры, связанные с GPU,но это не решит проблему.Если я использую команду ulimit linux, чтобы ограничить ОЗУ процесса python, чтобы сказать 4 ГБ, скрипт застрянет навсегда и даже не запустится - это почти как если бы он даже не начал выполнять то, что находится в основном методе скрипта.
Я просмотрел много онлайн-уроков именно по этой теме, и никто никогда не сталкивался с этой проблемой.Мой вопрос - как люди на самом деле это делают?Я явно что-то упускаю.Эта проблема не проявляется в Windows, обучение завершается, но мучительно медленно.
РЕДАКТИРОВАТЬ: Проблемная функция заключается в следующем:
def finetune():
upper_model = Sequential()
upper_model.add(Flatten(input_shape=core_model.output_shape[1:]))
upper_model.add(Dense(256, activation='relu'))
upper_model.add(Dropout(0.5))
upper_model.add(Dense(len(class_indices), activation='sigmoid'))
upper_model.load_weights(top_model_weights_filename)
final_model = Model(inputs=core_model.input, outputs=upper_model(core_model.output))
for layer in final_model.layers[:15]:
layer.trainable = False
final_model.compile(loss='binary_crossentropy',
# optimizer=optimizers.SGD(lr=1e-6, momentum=0.9),
optimizer=optimizers.RMSprop(lr=1e-5),
metrics=['accuracy'])
if not Path(final_model_weights_filename).is_file():
print("Final weights not found, calculating anew.")
data_augmentation_datagen = ImageDataGenerator(
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
data_augmentation_datagen.mean = normalization_datagen.mean
data_augmentation_datagen.std = normalization_datagen.std
val_loss_checkpoints = []
weights_checkpoints = []
for e in range(epochs):
print("-" * 100)
print("Epoch %d" % (e + 1))
print("-" * 100)
for i, (x_train, y_train) in enumerate(iterate_dataset('train', converted_images_dir)):
print('Iterating over training batch number %d at %s' % (i + 1, str(datetime.now().time())))
train_iterator = data_augmentation_datagen.flow(
x_train, y_train,
batch_size=batch_size,
shuffle=False)
steps = x_train.shape[0] // batch_size
if x_train.shape[0] % batch_size != 0:
steps += 1
final_model.fit_generator(train_iterator, steps)
loss = []
for i, (x_valid, y_valid) in enumerate(iterate_dataset('valid', converted_images_dir)):
print('Iterating over validation batch number %d' % (i + 1))
valid_iterator = normalization_datagen.flow(
x_valid, y_valid,
batch_size=batch_size,
shuffle=False)
steps = x_valid.shape[0] // batch_size
if x_valid.shape[0] % batch_size != 0:
steps += 1
batch_loss = final_model.evaluate_generator(valid_iterator, steps)
loss.append(batch_loss)
epoch_loss = np.array(loss).mean(axis=0)[0]
epoch_acc = np.array(loss).mean(axis=0)[1]
print('Loss after epoch %d is %.2f' % (e + 1, epoch_loss))
print('Accuracy after epoch %d is %.2f' % (e + 1, epoch_acc))
print()
final_model.save_weights(final_model_weights_filename)
else:
print("Reusing found final weights.")
final_model.load_weights(final_model_weights_filename)
return final_model
Я могу предоставить дополнительные объяснения, если это необходимо.