我想对图像上的图案进行分类。我的原始图像形状为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找到一个“好的”模型?
答案 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对象检测框架。