Тренировка бинарного CNN (Keras) - медленное время тренировки - PullRequest
0 голосов
/ 12 февраля 2019

Я тренирую двоичный CNN в кератах для классификации полярности эмоций (выражения), например, Smiling/Not_smiling.это мой кодЯ тренирую это на машине с несколькими графическими процессорами, но удивлен тем, сколько времени занимает эта тренировка.Каждый класс бинарной модели занимает 5-6 часов.Это нормально / ожидаемо?

Я ранее обучал multi-class модель, объединяющую все классы, и это заняло около 4 часов.

Примечание: каждый класс pos / neg содержит ~ 5000-10000 изображений.

Я правильно делаю?Ожидается ли продолжительность обучения?

class_names = ["smiling","frowning","surprised","sad"]
## set vars!
for cname in class_names:
    print("[+] training: ",model_name,cname)

    dp_path_train = './emotion_data/{0}/train/{1}'.format(model_name,cname)
    dp_path_val = './emotion_data/{0}/val/{1}'.format(model_name,cname)
    dir_checkpoint = './models'
    G = 2 # no. of gpus to use

    batch_size = 32 * G
    step_size = 1000//G
    print("[*] batch size & step size: ", batch_size,step_size)

    model = Sequential()
    model.add(Conv2D(32, kernel_size = (3, 3), activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 3)))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(BatchNormalization())
    model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(BatchNormalization())
    model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(BatchNormalization())
    model.add(Conv2D(96, kernel_size=(3,3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(BatchNormalization())
    model.add(Conv2D(32, kernel_size=(3,3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(BatchNormalization())
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.3))
    model.add(Dense(1, activation = 'sigmoid'))
    model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

    train_datagen = ImageDataGenerator(rescale = 1./255,
        shear_range = 0.2,
        zoom_range = 0.2,
        horizontal_flip = True)
    test_datagen = ImageDataGenerator(rescale = 1./255)

    training_set = train_datagen.flow_from_directory(dp_path_train,
        target_size = (224, 224),
        batch_size = batch_size,
        class_mode = 'binary')

    test_set = test_datagen.flow_from_directory(dp_path_val,
        target_size = (224, 224),
        batch_size = batch_size,
        class_mode = 'binary')

    model.fit_generator(training_set,
        steps_per_epoch = step_size,
        epochs = 50,
        validation_data = test_set,
        validation_steps = 2000)

    print("[+] saving model: ",model_name,cname)
    model.save("./models2/{0}_{1}.hdf5".format(model_name,cname))

1 Ответ

0 голосов
/ 18 февраля 2019

Удаление всех слоев BatchNormalization должно помочь ускорить процесс, или вы можете использовать его реже между слоями сетевой архитектуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...