提高 2D CNN 的准确性

时间:2021-02-27 21:48:27

标签: python tensorflow keras deep-learning conv-neural-network

我一直在尝试针对图像分类问题训练 2D CNN。我的数据由 64 x 64 像素图像组成,每个图像都标有 1-37 的数字。我的 CNN 架构如下:

train_dataset = train.flow_from_directory('/kaggle/input/temp-frames/frames/train', target_size=(64,64), batch_size=256, class_mode='categorical')
validation_dataset = train.flow_from_directory('/kaggle/input/temp-frames/frames/validation', target_size=(64,64), batch_size=256, class_mode='categorical')

model = Sequential()
model.add(Conv2D(filters= 64, kernel_size=(3,3), activation ='relu',strides = (2,2), padding = 'valid', input_shape= (64,64,3)))
model.add(MaxPooling2D(pool_size=(2,2), padding='same'))

model.add(Flatten())

model.add(Dense(1024, activation='relu'))
model.add(Dropout(.5))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(.5))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(.5))

model.add(Dense(37)) 
model.add(Activation('softmax'))

optimizer = keras.optimizers.Adam(lr=0.01)

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


history = model.fit(train_dataset, epochs = 100, batch_size = 32, validation_data = validation_dataset, shuffle = True)

出于某种原因,我的 2D CNN(获得 16% 的准确率)比我的 1D CNN(获得 30% 的准确率)表现差。我想知道是否有任何方法可以改进我的模型以获得更好的结果。

1 个答案:

答案 0 :(得分:1)

首先,我建议您在第一层使用步幅 1,而不是步幅为 2。在前两层(conv2d 和 maxpool)中,您已经将图像下采样到 16x16,并且网络没有机会做太多事情。在下采样之前,您希望每个唯一数量的过滤器至少有几层。

例如可能效果更好的架构:

(conv2d 64 个过滤器,步幅 1) x 3

conv2d 128 个过滤器,步幅 2

(conv2d 128 个过滤器,步幅 1) x 3

conv2d 256 个过滤器,步幅 2

(conv2d 256 个过滤器,步长 1) x 3

压平

密集层

对于架构设计的更多想法,我建议查看诸如 VGG 之类的模型: https://arxiv.org/pdf/1409.1556.pdf(第 3 页)。

您将无法逐字复制这些数据,因为您的数据较小,但请注意它们具有更多卷积层和更少密集层。他们也没有在开始时那么严厉地降采样。

我也很好奇你的数据集的大小,以及你的训练/验证/测试分割是什么。您是否成功地获得了接近 100% 的训练数据准确率?