2016-03-18 91 views
1

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

对于训练集,我有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') 

精度波动,但它达到每个时期后的0.75的最终值。 有什么我失踪?有什么我应该改变或添加为了这个工作?

回答

0

试图解释你的方法,你希望你的CNN只看29 * 29像素中的一个。我不是专家,但这听起来对CNN来说不是一个好问题。但是,通常如果您的网络对训练数据的结果不理想,则您的网络太小。所以你可以试着让它变大。你可以考虑的另一件事:你的设置(内核大小,图层,池)实际上实现了什么?您的设置可能会对这类任务不利吗?这里是我会做什么:

  • 试试这个没有CNN,即用1或2个完全连接层,看看会发生什么
  • 做出的决议“细”,即用(3,3)滤波器的尺寸
  • 删除maxpooling(maxpooling扔掉的信息,使功能更加不变的,我不知道你会需要这个)
  • 添加更多的转换次数层
  • 可能不相关,但你的数据集是非常小的,所以你不需要sgd的速度优势,可以换个优化器

您的培训和测试看起来如何?这是一个玩具项目吗?

+0

为什么这对于cnn来说不是个好问题? – maz