小数据集上的CNN过度装修

2024-04-26 01:00:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对图像上的图案进行分类。我原来的图像形状是200000*200000,我把它改成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个epoch时,大多数类都被分配给类0;epoch越多,类0就越不重要,但分类仍然不好

我在每个卷积层后添加了0.8个dropout

例如

    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找到一个“好”的模型?你知道吗


Tags: test图像addsizemodeltrainactivationkernel
2条回答

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

要使用Gan作为数据增强器,可以读取This Article。 用于像素级增强和GANpixel level data augmentation的组合

我在另一个环境中使用的是用ADASYN对我的数据进行上采样。此算法计算平衡类所需的新数据量,然后提取可用数据来采样新示例。你知道吗

有一个Python的实现。否则,你也只有很少的数据。支持向量机即使在数据很少的情况下也表现良好。您可能希望尝试它们或其他图像分类算法,这取决于预期模式始终位于同一位置或不同的位置。然后你也可以尝试Viola-Jones对象检测框架。你知道吗

相关问题 更多 >