用于图像分类的Keras CNN模型不能很好地推广

时间:2019-05-04 08:48:06

标签: python image-processing keras classification conv-neural-network

我想在喀拉拉邦实现一个基于频谱的情感分类模型(愤怒或不愤怒)。我已经使用Friends的音频数据集生成了频谱图。每个频谱图的长度为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学习率,Adam和0.0001学习率的不同组合,但是对于每种组合,训练损失都会减少,而验证损失会增加。 result result

1 个答案:

答案 0 :(得分:0)

模型似乎过拟合。您可以尝试以下方法来解决此问题。

  1. 如果可能,请尝试收集更多数据,或者可以使用数据扩充技术来增加样本数量。

  2. 您可以在Keras中使用分接来减少过度拟合。 (看起来您已经添加了Dropout,可以尝试调整值)

谢谢