Модель Keras CNN для классификации изображений не очень хорошо обобщает - PullRequest
0 голосов
/ 04 мая 2019

Я хочу реализовать модель в кератах для классификации настроений (гнев или не гнев) на основе спектрограмм.Я сгенерировал спектрограммы, используя набор аудиоданных от Друзей.Каждая спектрограмма имеет продолжительность 8 секунд.В общей сложности у меня есть 9117 образцов поездов, 1006 проверочных образцов и 2402 тестовых образца.

Я использую относительно простую архитектуру CNN, и я пробовал разные ее комбинации + оптимизатор + скорость обучения + размер партии, но ни один из результатовпохоже, хорошо обобщают ... Потери приятно уменьшаются до определенной точки, но потери проверки увеличиваются с каждой эпохой.

Это модель, которую я использую:

model = Sequential()
        model.add(Convolution2D(filters=32, kernel_size=3, strides=1,input_shape=input_shape, activation='relu', padding="same"))
        model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))  

        # model.add(ZeroPadding2D((1, 1)))
        model.add(Convolution2D(filters=64, kernel_size=3, strides=1, activation='relu', padding="same"))
        model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) 

        model.add(Convolution2D(filters=128, kernel_size=3, strides=1, activation='relu', padding="same"))
        model.add(MaxPooling2D((2, 2), strides=(2, 2))) 

        model.add(Flatten())
        model.add(Dense(128, activation='relu'))
        model.add(Dropout(0.5))
        model.add(Dense(128, activation='relu'))
        model.add(Dropout(0.5))
        model.add(Dense(classes, activation='sigmoid')) #output layer

Вот какЯ загружаю изображения:

img_rows = 120
img_cols = 160

train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
            SPECTOGRAMS_DIRECTORY + TRAIN_SUBDIR,
            target_size=(img_cols, img_rows),
            batch_size=batch_size,
            class_mode='binary')

validation_generator = validation_datagen.flow_from_directory(
                    SPECTOGRAMS_DIRECTORY + VALIDATION_SUBDIR,
                    target_size=(img_cols, img_rows),
                    batch_size=batch_size,
                    class_mode='binary')

test_generator = test_datagen.flow_from_directory(
                SPECTOGRAMS_DIRECTORY + TEST_SUBDIR,
                target_size=(img_cols, img_rows),
                batch_size=1,  
                class_mode='binary',
                shuffle=False)
input_shape=(img_cols, img_rows, channels)
opt = SGD(lr=0.001)
model.compile(loss='binary_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])

history = model.fit_generator(
        train_generator,
        steps_per_epoch=nb_train_samples // batch_size,
        epochs=epochs,
        validation_data=validation_generator,
        validation_steps=nb_validation_samples // batch_size,
        verbose=2)

##EVALUATE
print("EVALUATE THE MODEL...")
score = model.evaluate_generator(generator=validation_generator,
                         steps=nb_validation_samples // batch_size)

Спектограммы выглядят так: result

Как я уже говорил, я пытался использовать различные комбинации размера партии (16,32,64), SGD с 0,001 скоростью обучения, Адам с 0,0001 скоростью обучения, но для каждой комбинации потеря обучения уменьшается, а потеря проверки увеличивается.result result

1 Ответ

0 голосов
/ 04 мая 2019

Модель кажется более подходящей.Для преодоления этой проблемы вы можете попробовать следующие подходы.

  1. Если возможно, попробуйте собрать больше данных или вы можете использовать методы увеличения данных для увеличения количества выборок.

  2. Вы можете использовать выпадение в Keras, чтобы уменьшить перенастройку.(Похоже, вы уже добавили выпадение, вы можете попробовать настроить значения)

Спасибо

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