【问题标题】:Increase Accuracy on 2D CNN [closed]提高 2D CNN 的准确性 [关闭]
【发布时间】:2021-02-27 21:48:27
【问题描述】:

我一直在尝试针对图像分类问题训练 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% 的准确率)差。我想知道是否有任何方法可以改进我的模型以获得更好的结果。

【问题讨论】:

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


    【解决方案1】:

    首先,我建议您在第一层使用步幅 1,而不是两个步幅。在前两层(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% 的训练数据准确率?

    【讨论】:

    • 非常感谢您的帮助。我的数据集大小约为 10000 张图像,我将其分成 70% 的训练、15% 的验证和 15% 的测试。我可以在足够的时期达到 100% acc。
    • 听起来不错;是的,在那种情况下,它可能是一个架构问题。请注意,我在示例中修正了 strides 中的一个错字; x3 层的步幅应为 1。
    • 不。 Maxpool 用于下采样; 64x64 -> 32x32。步长为 2 的 CNN 层可以做同样的事情,甚至更多; 64x64 变为 32x32。所以在许多现代架构中,不再使用 maxpool 了。因此,我包含的两层跨度为 2。
    • 作为免责声明,我没有尝试过上述架构;我建议看看其他人用类似的图像尺寸做了什么。您必须更改下采样的数量或过滤器大小,以便扁平化输出与密集输入匹配。
    • 谢谢!我将尝试过滤器的大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多