小型数据集上的CNN过度拟合

时间:2019-05-02 09:39:26

标签: python machine-learning keras computer-vision conv-neural-network

我想对图像上的图案进行分类。我的原始图像形状为200000 * 200 000,我将其重塑为96 * 96,仍然可以用人眼识别出图案。像素值为0或1。

我正在使用以下神经网络。


train_X, test_X, train_Y, test_Y = train_test_split(cnn_mat, img_bin["Classification"], test_size = 0.2, random_state = 0)

class_weights = class_weight.compute_class_weight('balanced',
                                                 np.unique(train_Y),
                                                 train_Y)


train_Y_one_hot = to_categorical(train_Y)
test_Y_one_hot = to_categorical(test_Y)

train_X,valid_X,train_label,valid_label = train_test_split(train_X, train_Y_one_hot, test_size=0.2, random_state=13)


    model = Sequential()
    model.add(Conv2D(24,kernel_size=3,padding='same',activation='relu',
            input_shape=(96,96,1)))
    model.add(MaxPool2D())
    model.add(Conv2D(48,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Conv2D(64,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(256, activation='relu'))
    model.add(Dense(16, activation='softmax'))
    model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])

train = model.fit(train_X, train_label, batch_size=80,epochs=20,verbose=1,validation_data=(valid_X, valid_label),class_weight=class_weights)

我已经进行了一些实验,以找到大量的隐藏层和完全连接的层。它可能不是最佳架构,因为我的计算机运行缓慢,我只运行了一次不同的模型并选择了矩阵混淆的最佳模型,所以我没有使用交叉验证,我没有尝试更复杂的架构,因为数据很小,我读过小型架构是最好的,值得尝试更复杂的架构吗?

这里是5和12个时期的结果,巴赫大小为80。这是我的测试集

的混淆矩阵

正如您所看到的,我好像过头了。当我只运行5个纪元时,大多数班级都分配给班级0;时代越多,分类0的重要性就越小,但分类仍然很差

在每个卷积层之后我增加了0.8个辍学

例如

    model.add(Conv2D(48,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Dropout(0.8))
    model.add(Conv2D(64,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Dropout(0.8))

辍学后,我的图像中有95%被归为0级。

我尝试了图像增强;我旋转了所有训练图像,但仍使用加权激活功能,结果没有改善。 我应该尝试只增加少量图片的类吗?我读过的大部分内容都说可以扩充所有数据集...

恢复我的问题是: 我应该尝试更复杂的模型吗?

仅在未代表的班级上进行图像增强是否有用?那我还应该使用体重训练吗(我猜不是)?

当我们看到数据集的大小时,我是否希望通过cnn找到一个“好的”模型?

2 个答案:

答案 0 :(得分:2)

我认为,根据不平衡数据,最好为您的模型创建一个自定义数据生成器,以便每个生成的数据批均包含每个类中的至少一个样本。并且最好在每个Dropout层之后使用dense层,而不是conv层。对于数据增强,最好至少结合使用旋转,水平翻转和垂直翻转的组合。还有其他一些用于数据增强的方法,例如使用GAN网络或随机像素替换。 对于Gan,您可以选中This SO post

对于将Gan用作数据增强器,您可以阅读This Article。 对于像素级增强和GAN pixel level data augmentation

的组合

答案 1 :(得分:1)

在不同的设置下,我使用的是使用ADASYN对我的数据进行上采样。该算法计算出平衡您的班级所需的新数据量,然后将可用数据用于示例新颖示例。

Python有一个实现。否则,您的数据也很少。即使数据量很少,SVM的性能也很好。您可能要尝试使用它们或其他图像分类算法,具体取决于期望的图案始终位于相同位置或不同位置。然后,您也可以尝试Viola–Jones对象检测框架。

相关问题