Keras中图像的二进制分类

时间:2016-03-18 15:06:39

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

我试图在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 loss

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

准确度波动,但在每个时期后达到0.75的最终值。 有什么我想念的吗?有什么我应该改变或添加,以使其工作?

1 个答案:

答案 0 :(得分:0)

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

  • 在没有CNN的情况下尝试此操作,即使用1或2个完全连接的层,看看会发生什么
  • 使分辨率更精细,即使用(3,3)过滤器大小
  • 删除maxpooling(maxpooling丢弃信息以使功能更加不变,我不知道你需要这个)
  • 添加更多转化层
  • 可能不相关,但您的数据集非常小,因此您不需要sgd的速度优势,而是选择其他优化工具

您的训练和测试究竟如何?这是一个玩具项目吗?