【问题标题】:Binary classification of images in KerasKeras中图像的二元分类
【发布时间】:2016-07-05 09:51:09
【问题描述】:

我正在尝试在 Keras 中仅使用 1 个通道对图像 (29 x 29) 进行分类。如果中间像素在一定范围内,则输出为1,否则为0。

对于训练集,我有 10000 张输出为 1 的图像和 30000 张输出为 0 的图像,我使用以下架构:

model = Sequential()

# kernel = (4, 4); 6 outputmaps  26x26 
model.add(Convolution2D(6, 4, 4, input_shape=(img_channels, img_rows, img_columns)))
model.add(Activation('relu'))
# 6 outputmaps of 13x13
model.add(MaxPooling2D(pool_size=(2, 2)))
# 12 outputmaps of 10x10 ; kernel = (4, 4)
model.add(Convolution2D(12, 4, 4))
model.add(Activation('relu'))
# 12 outputmaps of 5x5
model.add(MaxPooling2D(pool_size=(2, 2)))
# 24 outputmaps of 4x4 ; kernel = (2, 2)
model.add(Convolution2D(24, 2, 2))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))

对于编译,我使用的是 binary_crossentropy 损失

model.compile(loss='binary_crossentropy', optimizer='sgd', class_mode='binary')

准确率会波动,但在每个 epoch 后会达到 0.75 的最终值。 有什么我想念的吗?为了使它起作用,我应该更改或添加什么吗?

【问题讨论】:

    标签: neural-network classification conv-neural-network keras


    【解决方案1】:

    试图解释您的方法,您希望 CNN 仅查看 29*29 像素中的 1 个。我不是专家,但这对于 CNN 来说听起来不是一个好问题。但是,通常如果您的网络在训练数据上取得了不好的结果,那么您的网络就太小了。所以你可以试着把它变大。您可以考虑的另一件事是:您的设置(内核大小、层、池化)实际上实现了什么?您的设置可能不适合此类任务吗?这是我会做的:

    • 尝试不使用 CNN,即使用 1 或 2 个全连接层,看看会发生什么
    • 使分辨率“更精细”,即使用 (3,3) 滤镜尺寸
    • 删除 maxpooling(maxpooling 丢弃信息以使功能更加不变,我认为您不需要这个)
    • 添加更多的卷积层
    • 可能不相关,但您的数据集非常小,因此您不需要 sgd 的速度优势,请改用另一个优化器

    您的训练和测试的具体情况如何?这是一个玩具项目吗?

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 2019-08-27
      • 2018-06-23
      • 2018-11-03
      • 2019-01-13
      • 2018-06-21
      • 2018-07-15
      • 2018-08-14
      • 2017-09-09
      相关资源
      最近更新 更多