Как потренировать модель tenorflow на Ubuntu? - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь обучить модель с тензорным потоком на машине с 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

Я могу предоставить дополнительные объяснения, если это необходимо.

...